it('JDS returns no error and no response.', function() {
			jdsClientDummy._setResponseData(null, null, undefined);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, vistaIdValue, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.storeLastUpdateTime(lastUpdateTimeValue, function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to storeLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError).toBeTruthy();
				expect(actualResponse).toBeNull();
				expect(jdsClientDummy.storeOperationalDataMutable.calls.length).toEqual(1);
				expect(jdsClientDummy.storeOperationalDataMutable).toHaveBeenCalledWith(jasmine.objectContaining({
					_id: vistaIdValue,
					lastUpdate: lastUpdateTimeValue,
					uid: uidValue
				}), jasmine.any(Function));
			});
		});
		it('JDS returns no error but incorrect response.statusCode', function() {
			var expectedJdsResponse = {
				statusCode: 100
			};
			jdsClientDummy._setResponseData(null, expectedJdsResponse, undefined);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, vistaIdValue, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.retrieveLastUpdateTime(function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to retrieveLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError).toBeTruthy();
				expect(actualResponse).toBeNull();
				expect(jdsClientDummy.getOperationalDataMutable.calls.length).toEqual(1);
				expect(jdsClientDummy.getOperationalDataMutable).toHaveBeenCalledWith(vistaIdValue, jasmine.any(Function));
			});
		});
		it('JDS returns response - but response did not have the actual item.', function() {
			var expectedJdsResponse = {
				statusCode: 200
			};
			var expectedJdsResult = {
				apiVersion: '1.0',
				data: {
					updated: '20141231144448',
					totalItems: 0,
					currentItemCount: 0
				}
			};
			jdsClientDummy._setResponseData(null, expectedJdsResponse, expectedJdsResult);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, vistaIdValue, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.retrieveLastUpdateTime(function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to retrieveLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError).toBeTruthy();
				expect(actualResponse).toBeNull();
				expect(jdsClientDummy.getOperationalDataMutable.calls.length).toEqual(1);
				expect(jdsClientDummy.getOperationalDataMutable).toHaveBeenCalledWith(vistaIdValue, jasmine.any(Function));
			});
		});
		it('JDS returns error.', function() {

			var expectedJdsError = 'Failed call to JDS.';
			jdsClientDummy._setResponseData(expectedJdsError, null, undefined);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, vistaIdValue, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.retrieveLastUpdateTime(function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to retrieveLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError.indexOf(expectedJdsError)).toBeGreaterThan(-1);
				expect(actualResponse).toBeNull();
				expect(jdsClientDummy.getOperationalDataMutable.calls.length).toEqual(1);
				expect(jdsClientDummy.getOperationalDataMutable).toHaveBeenCalledWith(vistaIdValue, jasmine.any(Function));
			});
		});
		it('Missing vistaId', function() {
			var expectedJdsResponse = {
				statusCode: 200
			};
			jdsClientDummy._setResponseData(null, expectedJdsResponse, null);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, null, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.retrieveLastUpdateTime(function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to retrieveLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError).toBeTruthy();
				expect(actualResponse).toBeNull();
				expect(jdsClientDummy.getOperationalDataMutable.calls.length).toEqual(0);
			});
		});
		it('Happy Path', function() {

			var expectedJdsResponse = {
				statusCode: 200
			};
			var expectedJdsResult = {
						_id: vistaIdValue,
						lastUpdate: lastUpdateTimeValue,
						uid: uidValue
			};
			jdsClientDummy._setResponseData(null, expectedJdsResponse, expectedJdsResult);
			var vprUpdateOpData = new VprUpdateOpData(dummyLogger, vistaIdValue, jdsClientDummy);
			var actualError;
			var actualResponse;
			var called = false;
			vprUpdateOpData.retrieveLastUpdateTime(function(error, response) {
				actualError = error;
				actualResponse = response;
				called = true;
			});

			waitsFor(function() {
				return called;
			}, 'Call to retrieveLastUpdateTime failed to return in time.', 500);

			runs(function() {
				expect(actualError).toBeNull();
				expect(actualResponse).toEqual(lastUpdateTimeValue);
				expect(jdsClientDummy.getOperationalDataMutable.calls.length).toEqual(1);
				expect(jdsClientDummy.getOperationalDataMutable).toHaveBeenCalledWith(vistaIdValue, jasmine.any(Function));
			});
		});
 it('Error path: JDS returns error', function() {
     var done = false;
     var config = {
         vistaSites: {
             '9E7A': {},
             'C877': {}
         },
         jds: {
             protocol: 'http',
             host: '10.2.2.110',
             port: 9080
         },
         rules: {
             'operational-data-sync': {}
         }
     };
     var jdsClientDummy = new JdsClientDummy(log, config);
     jdsClientDummy._setResponseData(['Error', 'Error'], null, null);
     var environment = {
         jds: jdsClientDummy
     };
     var engine = new SyncRulesEngine(log, config, environment);
     //engine.rules = [rule];
     runs(function() {
         engine.getSyncPatientIdentifiers(mockPatientIds, [], function(err, result) {
             expect(result.length).toEqual(0);
             done = true;
         });
     });
     waitsFor(function() {
         return done;
     });
 });
 it('Normal path: all primary sites associated with patient have completed opd sync', function() {
     var done = false;
     var config = {
         vistaSites: {
             '9E7A': {},
             'C877': {}
         },
         jds: {
             protocol: 'http',
             host: '10.2.2.110',
             port: 9080
         },
         rules: {
             'operational-data-sync': {}
         }
     };
     var jdsClientDummy = new JdsClientDummy(log, config);
     jdsClientDummy._setResponseData(null, [{
         statusCode: 200
     }, {
         statusCode: 200
     }], [{
         'completedStamp': sampleOpDataStamp
     }, {
         'completedStamp': sampleOpDataStamp2
     }]);
     var environment = {
         jds: jdsClientDummy
     };
     var engine = new SyncRulesEngine(log, config, environment);
     //engine.rules = [rule];
     runs(function() {
         engine.getSyncPatientIdentifiers(mockPatientIds, [], function(err, result) {
             expect(result.length).toEqual(6);
             done = true;
         });
     });
     waitsFor(function() {
         return done;
     });
 });