Postman : How to assert all array elements exist in other array?
Asked Answered
F

3

10

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

Fredelia answered 12/7, 2019 at 11:37 Comment(0)
R
9

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

});
Reimers answered 12/7, 2019 at 12:18 Comment(1)
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 chaiFredelia
A
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' 
  }
})
Asci answered 12/7, 2019 at 11:55 Comment(0)
T
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
Tristan answered 12/7, 2019 at 11:55 Comment(1)
havent tried your solution , but thanks for answering the queryFredelia

© 2022 - 2024 — McMap. All rights reserved.