hapijs / code

Assertion library

Repository from Github https://github.comhapijs/codeRepository from Github https://github.comhapijs/code

Incorrect prototype check

Eomm opened this issue · comments

Support plan

  • is this issue currently blocking your project? yes
  • is this issue affecting a production system? no

Context

  • node version: 18.x
  • module version with issue: 9.0.3
  • last module version without issue: NA
  • environment (e.g. node, browser, native): node
  • used with @hapi/lab@25.1.2
  • any other relevant information: NA

What are you trying to achieve or the steps to reproduce?

The module does not ignore the prototype during a comparison.

const Code = require('@hapi/code');

const noProto = Object.create(null);
noProto.a = Object.create(null);
noProto.a.b = 1;

Code.settings.comparePrototypes = false;
Code.expect([noProto]).to.once.include({ a: { b: 1 } });

** By using simple objects {} the comparison works as expected.

What was the result you got?

/Users/manuel_spigolon/dev/misc/hapi/code/lib/index.js:139
    throw error;
    ^

Error: Expected [ [Object: null prototype] { a: [Object: null prototype] { b: 1 } } ] to include { a: { b: 1 } } once
    at internals.Assertion.internals.include (/Users/manuel_spigolon/dev/misc/hapi/code/lib/index.js:239:17)
    at Object.<anonymous> (/Users/manuel_spigolon/dev/misc/hapi/code/asd.js:8:32)
    at Module._compile (node:internal/modules/cjs/loader:1155:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10)
    at Module.load (node:internal/modules/cjs/loader:1033:32)
    at Function.Module._load (node:internal/modules/cjs/loader:868:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:22:47 {
  actual: undefined,
  expected: undefined,
}

What result did you expect?

No error due to the default comparePrototypes = false setting

comparePrototypes is only supposed to work for equal() / equals().

You should be able to workaround this by checking each array element yourself using equal().

Would you mind accepting a PR to support it with arrays too?