jeudi 7 juillet 2016

mock a http request to respond according to response status. how do I approach this

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