@ 261105.16
current
'use strict';
require('../common');
const assert = require('node:assert');
const test = require('node:test');

test('expected methods are on t.assert', (t) => {
  const uncopiedKeys = [
    'AssertionError',
    'strict',
    'Assert',
    'options',
  ];
  const assertKeys = Object.keys(assert).filter((key) => !uncopiedKeys.includes(key));
  const expectedKeys = [
    'snapshot',
    'fileSnapshot',
    'called',
    'callCount',
    'lastCalledWith',
    'nthCalledWith',
  ].concat(assertKeys).sort();
  assert.deepStrictEqual(Object.keys(t.assert).sort(), expectedKeys);
});

test('t.assert.ok correctly parses the stacktrace', (t) => {
  t.assert.throws(() => t.assert.ok(1 === 2), /t\.assert\.ok\(1 === 2\)/);
});

test('t.assert.called', (t) => {
  const fn = t.mock.fn();
  t.assert.throws(() => t.assert.called(fn), {
    code: 'ERR_ASSERTION',
    message: 'Expected mock function to have been called',
  });
  fn();
  t.assert.called(fn);
  t.assert.throws(() => t.assert.called(() => {}), {
    code: 'ERR_INVALID_ARG_TYPE',
  });
});

test('t.assert.callCount', (t) => {
  const fn = t.mock.fn();
  t.assert.callCount(fn, 0);
  fn();
  fn();
  t.assert.callCount(fn, 2);
  t.assert.throws(() => t.assert.callCount(fn, 1), {
    code: 'ERR_ASSERTION',
    message: 'Expected mock function to have been called 1 times, but it was called 2 times',
  });
  t.assert.throws(() => t.assert.callCount(fn, -1), {
    code: 'ERR_OUT_OF_RANGE',
  });
});

test('t.assert.nthCalledWith', (t) => {
  const fn = t.mock.fn();
  fn(1);
  fn({ a: 2 });
  t.assert.nthCalledWith(fn, 1, 1);
  t.assert.nthCalledWith(fn, 2, { a: 2 });
  t.assert.throws(() => t.assert.nthCalledWith(fn, 2, { a: 3 }), {
    code: 'ERR_ASSERTION',
    message: /^Expected call 2 of mock function to have been called with:/,
    actual: [{ a: 2 }],
    expected: [{ a: 3 }],
  });
  t.assert.throws(() => t.assert.nthCalledWith(fn, 3, 1), {
    code: 'ERR_ASSERTION',
    message: 'Expected mock function to have been called at least 3 times, but it was called 2 times',
  });
  t.assert.throws(() => t.assert.nthCalledWith(fn, 0, 1), {
    code: 'ERR_OUT_OF_RANGE',
  });
});

test('t.assert.lastCalledWith', (t) => {
  const fn = t.mock.fn();
  t.assert.throws(() => t.assert.lastCalledWith(fn), {
    code: 'ERR_ASSERTION',
    message: 'Expected mock function to have been called',
  });
  fn(1);
  fn(2);
  t.assert.lastCalledWith(fn, 2);
  t.assert.throws(() => t.assert.lastCalledWith(fn, 1), {
    code: 'ERR_ASSERTION',
    actual: [2],
    expected: [1],
  });
});

test('mock matchers count towards t.plan()', (t) => {
  t.plan(4);
  const fn = t.mock.fn();
  fn(1);
  t.assert.called(fn);
  t.assert.callCount(fn, 1);
  t.assert.nthCalledWith(fn, 1, 1);
  t.assert.lastCalledWith(fn, 1);
});