8

I'm asserting for elements in array1 does exist in array2 or not, below are the array samples,

var array1 = [
        {
            "name": "appe",
            "loc": "war",
            "order": 5,
            "neck": "NO",
            "end": false
        },
        {
            "name": "con",
            "loc": "conve",
            "order": 15,
            "neck": "NO",
            "end": true
        }]

var array2 = [{"neck":"NO"
"end":true,
"loc":"conve",
"name":"con",
"order":15
}]

code I tried -

const lodash = require("lodash");
    for(var i = 0; i < array2.length; i++ )
    {
            tests['response json contain Data'] = lodash._.has(points, array2[i]);
            //pm.expect(array2[i]).to.be.oneOf(array1);

    }

error I get -

response json contain Data | AssertionError: expected false to be truthy

EDIT after trying another attempt2 -

pm.expect(array2[i]).to.be.oneOf(array1);

error -

AssertionError | expected { Object (name, loc, ...) } to be one of [ Array(20) ]

attempt3 -

pm.expect(array1).to.deep.equal(array2);

error -

AssertionError | expected [ Array(20) ] to deeply equal [ Array(18) ]

what I'm doing wrong?. what I want is if any one element in array2 is not in array1 it should fail.
Thanks

Dev
  • 2,739
  • 2
  • 21
  • 34

3 Answers3

7

Chai assertion Library is included by Postman by default in its application. So you need to use the to.deep.equal. It will compare nested arrays as well as nested objects.

SOLUTION:

pm.test("verify two objects", function () {
  var array1 = [{
    "name": "appe",
    "loc": "war",
    "order": 5,
    "neck": "NO",
    "end": false
  },
  {
    "name": "con",
    "loc": "conve",
    "order": 15,
    "neck": "NO",
    "end": true
  }];

  var array2 = [{
    "neck": "NO",
    "end": true,
    "loc": "conve",
    "name": "con",
    "order": 15
  }, 
  {
    "neck": "NOo",
    "end": true,
    "loc": "conve",
    "name": "con",
    "order": 15
  }];

  pm.expect(array1).to.deep.equal(array2); // Failed
  pm.expect(array1).to.deep.equal(array1); // Passed

});
Yevhen Laichenkov
  • 7,746
  • 2
  • 27
  • 33
  • thanks for correcting me, It worked for me when I filter out data from array1 and make its length equal to array2, addition to it there is [assertion to compare different lengths of arrays using memebrs method of chai](https://www.chaijs.com/api/bdd/#method_members) – Dev Jul 14 '19 at 12:23
1

var array1 = [{
    "name": "appe",
    "loc": "war",
    "order": 5,
    "neck": "NO",
    "end": false
  },
  {
    "name": "con",
    "loc": "conve",
    "order": 15,
    "neck": "NO",
    "end": true
  }
]

var array2 = [{
  "neck": "NO",
  "end": true,
  "loc": "conve",
  "name": "con",
  "order": 15
}]

array2.forEach( item => {
  if ( !array1.includes(item)){
  throw 'doesn\'t include' 
  }
})
kcsujeet
  • 465
  • 2
  • 8
1

what I want is if any one element in array2 is not in array1 it should fail

var array1 = [{
    "name": "appe",
    "loc": "war",
    "order": 5,
    "neck": "NO",
    "end": false
  },
  {
    "name": "con",
    "loc": "conve",
    "order": 15,
    "neck": "NO",
    "end": true
  }
]

var array2 = [{
  "neck": "NO",
  "end": true,
  "loc": "conve",
  "name": "con",
  "order": 15
}, {
  "neck": "NOo",
  "end": true,
  "loc": "conve",
  "name": "con",
  "order": 15
}];

// Finds at least one object on array2 which is not in array1.
// The function some finds at least one according to the 
// result of findIndex which is using a handler who executes 
// the function every.
// The function every, basically, compares every key-value 
// between array2 and array1.
let result = array2.some(o => array1.findIndex(ao => Object.entries(o).every(([key, value]) => ao[key] === value)) === -1);

console.log(result); // Returns true because one element is not in array1
Ele
  • 33,468
  • 7
  • 37
  • 75