I am writing a service that calls Restful web service.
The Restful web service returns a response with one of the two status codes:
Response status = 200 with the data found in json array(GET) Response status = 201 with a url to insert data(POST) if data is not found in json array. I know that when I call the service it could check for the response status and behave accordingly.
So my question would be, is it good practice or possible to call another url with $http POST call from within a $http GET call if the object is not found
If all that is good, then how should I be writing a karma test for it.
I have tried $httpBackend within "it" test but it throws a
Unexpected request: GET
No more request expected
at $httpBackend(node_modules/angular-mocks/angular-mocks.js) I have written code for when it returns a 200 response. But I don't know how to return a 201 response if my data is not found.
I was thinking of writing another function in that service which takes care of the $http POST call.
Basically I am trying to mimic server which I don't have yet. I tried going through a few links but I am not very clear on the way to do it.
My code so far looks like this:
angular.module('client.scan',[])
.factory('MyService', MyService);
MyService.$inject = ['$http'];
function MyService($http) {
var vm = this;
var childLowerLimit = 5000000000000000;
vm.service = {
insertData : insertData,
getDetail : getDetail
};
function getDetail(containerLabel){
vm.masterData = [];
var isMaster = false;
var isMasterFound = false;
if(containerLabel < childLowerLimit) {
isMaster = true;
}
var childStore = containerLabel.slice(-4);
console.log('store: '+containerLabel.slice(-4)+' '+childStore);
return $http.get('app/build/masterData.json').then(function(response) {
vm.masterData = response.data;
var masterExists = false;
var mymasterData = []; // to store the master containing child with id: containerLabel
angular.forEach(vm.masterData, function (item) {
angular.forEach(item, function (child) {
if (childStore === child.store) {
mymasterData = child;
isMasterFound = true;
}
if(!isMasterFound)
{//if child is not found for any master, put it in master with store = 2006
if(child.store === '2006')
mymasterData = child;
}
});
});
if (isMasterFound)
{
return mymasterData;
}
else
return insertData(mymasterData,containerLabel);
});
}
function insertData(mymasterData, containerLabel) {
return $http.post('app/build/masterData.json').then(function(response) {
var masterObject = {"version": mymasterData.version,
"masterId": mymasterData.masterId,
"children": [],
"statusCode": mymasterData.statusCode};
mymasterData.children.push({"createdOn":1466446144571, "createdBy":"test","childContainerTrackingId":containerLabel, "masterContainer":masterObject});
return mymasterData;
});
};
return vm.service;
};
karma test for it is:
describe('MyService', function() {
var mockservicedata = [{"version":1,"masterId":"1000000000002001","store":"2001","children":[{"createdOn":1466446144569,"createdBy":"test","childId":"5100000000002001","master":{"version":1,"masterId":"1000000000002001","children":[],"statusCode":1}},{"createdOn":1466446144569,"createdBy":"test","childId":"5200000000002001","master":{"version":1,"masterId":"1000000000002001","children":[],"statusCode":1}}],"statusCode":1},{"version":1,"masterId":"1000000000002002","store":"2002","children":[{"createdOn":1466446144570,"createdBy":"test","childId":"5300000000002002","master":{"version":1,"masterId":"1001000000000002002","children":[],"statusCode":1}},{"createdOn":1466446144570,"createdBy":"test","childId":"5400000000002002","master":{"version":1,"masterId":"1000000000002002","children":[],"statusCode":1}}],"statusCode":1},{"version":1,"masterId":"1000000000002003","store":"2003","children":[{"createdOn":1466446144570,"createdBy":"test","childId":"5500000000002003","master":{"version":1,"masterId":"1000000000002003","children":[],"statusCode":1}},{"createdOn":1466446144571,"createdBy":"test","childId":"5600000000002003","master":{"version":1,"masterId":"1000000000002003","children":[],"statusCode":1}},{"createdOn":1466446144571,"createdBy":"test","childId":"5700000000002003","master":{"version":1,"masterId":"1000000000002003","children":[],"statusCode":1}}],"statusCode":1},{"version":1,"masterId":"1000000000002004","store":"2004","children":[{"createdOn":1466446144571,"createdBy":"test","childId":"5800000000002004","master":{"version":1,"masterId":"1000000000002004","children":[],"statusCode":1}}],"statusCode":1},{"version":1,"masterId":"1000000000002004","store":"2004","children":[{"createdOn":1466446144571,"createdBy":"test","childId":"5800000000002004","master":{"version":1,"masterId":"1000000000002004","children":[],"statusCode":1}}],"statusCode":1},{"version":1,"masterId":"1111111111112006","store":"2006","children":[],"statusCode":1}];
var responseTest = { version: 1, masterId: '1000000000002001', store: '2001', children: [ Object({ createdOn: 1466446144569, createdBy: 'test', childId: '5100000000002001', master: Object({ version: 1, masterId: '1000000000002001', children: [ ], statusCode: 1 }) }), Object({ createdOn: 1466446144569, createdBy: 'test', childId: '5200000000002001', master: Object({ version: 1, masterId: '1000000000002001', children: [ ], statusCode: 1 }) }) ], statusCode: 1 };
var insertResponseTest = {"version":1,"masterId":"1111111111112006","store":"2006","children":[{"createdOn":1466446144571,"createdBy":"test","childId":"5800000000002008","master":{"version":1,"masterId":"1111111111112006","children":[],"statusCode":1}}],"statusCode":1};
var MyService = {};
var $httpBackend;
beforeEach(module('ui.router'));
beforeEach(module('client.scan',function($provide){
$provide.value('$log',console);
}));
beforeEach(inject(function(_MyService_, _$httpBackend_) {
MyService = _MyService_;
$httpBackend = _$httpBackend_;
$httpBackend.when('GET', "app/build/masterData.json").respond({
status: 200,
data: mockservicedata
});
$httpBackend.when('POST',"app/build/masterData.json").respond({
status: 201,
data: mockservicedata
});
}));
it(' should return master data with response 200', function(){
// jasmine.spyOn(MyService, "getData").and.returnValue(mockservicedata);
MyService.getDetail('51000002001')
.then(function(response){
expect(response).toEqual(responseTest);
//expect(response.status).toEqual('200'); //this line throws error
});
$httpBackend.flush();
});
it(' should test for response status 201', function(){
console.log('in mine should test for response status 201');
MyService.getDetail('5800000000002008').then(function(response){
expect(response).toEqual(insertResponseTest);
});
$httpBackend.flush();
});
});
Is this the right approach. since I dont have a server side RESt service available, I have written it like this.
Aucun commentaire:
Enregistrer un commentaire