From e240660f79638ac20f6c0fbc9b53983a1b4ac873 Mon Sep 17 00:00:00 2001 From: ninevra Date: Sun, 12 Jul 2020 16:54:11 -0700 Subject: [PATCH 1/7] Test use-t-well with like() assertion --- test/use-t-well.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/use-t-well.js b/test/use-t-well.js index f4fe4f38..03a70720 100644 --- a/test/use-t-well.js +++ b/test/use-t-well.js @@ -69,6 +69,10 @@ ruleTester.run('use-t-well', rule, { testCase('t.try(tt => tt.pass(), 1, 2)'), testCase('t.try(\'title\', tt => tt.pass())'), testCase('t.try(\'title\', tt => tt.pass(), 1, 2)'), + testCase('t.like'), + testCase('t.like(v, v)'), + testCase('t.like(actual, {}, "")'), + testCase('t.like.skip(v, v)'), // Shouldn't be triggered since it's not a test file testCase('t.foo(a, a);', false), testCase('t.foo;', false) @@ -205,6 +209,11 @@ ruleTester.run('use-t-well', rule, { { code: testCase('t.deepEqual.context(a, a);'), errors: [error('Unknown assertion method `.context`.')] + }, + { + code: testCase('t.lik(a, a);'), + output: testCase('t.like(a, a);'), + errors: [error('Misspelled `.like` as `.lik`.')] } ] }); From 76cd8f5489bc3c3bb139fbf90306ea9fca2b5b49 Mon Sep 17 00:00:00 2001 From: ninevra Date: Sun, 12 Jul 2020 17:03:52 -0700 Subject: [PATCH 2/7] Add like() assertion to list of assertion methods Supports like() in use-t-well. --- util.js | 1 + 1 file changed, 1 insertion(+) diff --git a/util.js b/util.js index bb0c66f2..9b54e551 100644 --- a/util.js +++ b/util.js @@ -105,6 +105,7 @@ const assertionMethodsNumberArguments = new Map([ ['falsy', 1], ['ifError', 1], ['is', 2], + ['like', 2], ['not', 2], ['notDeepEqual', 2], ['notRegex', 2], From f669f1535af3ae2a0fe62b85281d204f77bed922 Mon Sep 17 00:00:00 2001 From: ninevra Date: Sun, 12 Jul 2020 17:22:25 -0700 Subject: [PATCH 3/7] Test assertion-arguments with like() assertion --- test/assertion-arguments.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/assertion-arguments.js b/test/assertion-arguments.js index 05cb0332..202a01ac 100644 --- a/test/assertion-arguments.js +++ b/test/assertion-arguments.js @@ -53,6 +53,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.true(true, \'message\');'), testCase(false, 't.truthy(\'unicorn\', \'message\');'), testCase(false, 't.snapshot(value, \'message\');'), + testCase(false, 't.like({}, {}, \'message\');'), testCase(false, 't.context.plan();'), testCase(false, 't.teardown(() => {});'), testCase(false, 't.timeout(100, \'message\');'), @@ -79,6 +80,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.true(true);'), testCase(false, 't.truthy(\'unicorn\');'), testCase(false, 't.snapshot(value);'), + testCase(false, 't.like({}, {});'), // Shouldn't be triggered since it's not a test file testCase(false, 't.true(true, \'message\');', [], false), @@ -105,6 +107,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.skip.is(\'same\', \'same\', \'message\');'), testCase('always', 't.is.skip(\'same\', \'same\', \'message\');'), testCase('always', 't.snapshot(value, \'message\');'), + testCase('always', 't.like({}, {}, \'message\');'), testCase('always', 't.teardown(() => {});'), testCase('always', 't.timeout(100, \'message\');'), testCase('always', 't.try(tt => tt.pass());'), @@ -138,6 +141,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.skip.is(\'same\', \'same\');'), testCase('never', 't.is.skip(\'same\', \'same\');'), testCase('never', 't.snapshot(value);'), + testCase('never', 't.like({}, {});'), testCase('never', 't.teardown(() => {});'), testCase('never', 't.timeout(100);'), testCase('never', 't.try(tt => tt.pass());'), @@ -190,6 +194,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.skip.is(\'same\');', tooFewError(2)), testCase(false, 't.is.skip(\'same\');', tooFewError(2)), testCase(false, 't.snapshot();', tooFewError(1)), + testCase(false, 't.like({});', tooFewError(2)), testCase(false, 't.teardown();', tooFewError(1)), testCase(false, 't.timeout();', tooFewError(1)), testCase(false, 't.try();', tooFewError(1)), @@ -214,6 +219,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.skip.is(\'same\', \'same\', \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.is.skip(\'same\', \'same\', \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.snapshot(value, \'message\', \'extra argument\');', tooManyError(2)), + testCase(false, 't.like({}, {}, \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.teardown(() => {}, \'extra argument\');', tooManyError(1)), testCase(false, 't.timeout(1, \'message\', \'extra argument\');', tooManyError(2)), @@ -236,6 +242,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.skip.is(\'same\', \'same\');', missingError), testCase('always', 't.is.skip(\'same\', \'same\');', missingError), testCase('always', 't.snapshot(value);', missingError), + testCase('always', 't.like({}, {});', missingError), testCase('never', 't.pass(\'message\');', foundError), testCase('never', 't.fail(\'message\');', foundError), @@ -255,6 +262,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.skip.is(\'same\', \'same\', \'message\');', foundError), testCase('never', 't.is.skip(\'same\', \'same\', \'message\');', foundError), testCase('never', 't.snapshot(value, \'message\');', foundError), + testCase('never', 't.like({}, {}, \'message\');', foundError), testCase(false, 't.end(\'too many\', \'arguments\');', tooManyError(1)), testCase(false, 't.skip.end(\'too many\', \'arguments\');', tooManyError(1)), From 12409d9098e259a0b7f1aa0f05b42c46641b4407 Mon Sep 17 00:00:00 2001 From: ninevra Date: Sun, 12 Jul 2020 17:24:09 -0700 Subject: [PATCH 4/7] Support like in assertion-arguments --- rules/assertion-arguments.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/assertion-arguments.js b/rules/assertion-arguments.js index 171ce248..a6c14944 100644 --- a/rules/assertion-arguments.js +++ b/rules/assertion-arguments.js @@ -28,6 +28,10 @@ const expectedNbArguments = { min: 2, max: 3 }, + like: { + min: 2, + max: 3 + }, not: { min: 2, max: 3 From 88df3097a69fe090dfbe778d40a39f8f25fbc68d Mon Sep 17 00:00:00 2001 From: ninevra Date: Sun, 12 Jul 2020 17:39:46 -0700 Subject: [PATCH 5/7] Document & test that prefer-power-assert allows like() prefer-power-assert allows asserts "with no power-assert alternative"; like() appears to be one such assertion. --- docs/rules/prefer-power-assert.md | 1 + test/prefer-power-assert.js | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/rules/prefer-power-assert.md b/docs/rules/prefer-power-assert.md index 497b8249..6e1999c9 100644 --- a/docs/rules/prefer-power-assert.md +++ b/docs/rules/prefer-power-assert.md @@ -5,6 +5,7 @@ Translations: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/re - [`t.assert()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#assertvalue-message) - [`t.deepEqual()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#deepequalvalue-expected-message) - [`t.notDeepEqual()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#notdeepequalvalue-expected-message) +- [`t.like()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#likevalue-selector-message) - [`t.throws()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#throwsfn-expected-message) - [`t.notThrows()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#notthrowsfn-message) - [`t.pass()`](https://github.com/avajs/ava/blob/master/docs/03-assertions.md#passmessage) diff --git a/test/prefer-power-assert.js b/test/prefer-power-assert.js index 40ba38b1..74ccddff 100644 --- a/test/prefer-power-assert.js +++ b/test/prefer-power-assert.js @@ -64,6 +64,7 @@ function testAllowedMethod(methodName) { const allowedMethods = [ 'assert(foo)', 'deepEqual(foo, bar)', + 'like(foo, bar)', 'notDeepEqual(foo, bar)', 'throws(block)', 'notThrows(block)', From 0b89f04fa2940a71a32ce2ad2077d9c1e75f3b9b Mon Sep 17 00:00:00 2001 From: ninevra Date: Sat, 18 Jul 2020 23:29:52 -0700 Subject: [PATCH 6/7] refactor: reorder assertion-args tests for consistency Place t.like() tests between t.is() and t.not() in alphabetically-ordered blocks, and after t.deepEqual() and t.notDeepEqual() in structurally-ordered blocks. --- test/assertion-arguments.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/assertion-arguments.js b/test/assertion-arguments.js index 202a01ac..ed6c1cd4 100644 --- a/test/assertion-arguments.js +++ b/test/assertion-arguments.js @@ -42,6 +42,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.ifError(new Error(), \'message\');'), testCase(false, 't.is.skip(\'same\', \'same\', \'message\');'), testCase(false, 't.is(\'same\', \'same\', \'message\');'), + testCase(false, 't.like({}, {}, \'message\');'), testCase(false, 't.not(\'not\', \'same\', \'message\');'), testCase(false, 't.notDeepEqual({}, {a: true}, \'message\');'), testCase(false, 't.notThrows(Promise.resolve(), \'message\');'), @@ -53,7 +54,6 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.true(true, \'message\');'), testCase(false, 't.truthy(\'unicorn\', \'message\');'), testCase(false, 't.snapshot(value, \'message\');'), - testCase(false, 't.like({}, {}, \'message\');'), testCase(false, 't.context.plan();'), testCase(false, 't.teardown(() => {});'), testCase(false, 't.timeout(100, \'message\');'), @@ -68,6 +68,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.ifError(new Error());'), testCase(false, 't.is.skip(\'same\', \'same\');'), testCase(false, 't.is(\'same\', \'same\');'), + testCase(false, 't.like({}, {});'), testCase(false, 't.not(\'not\', \'same\');'), testCase(false, 't.notDeepEqual({}, {a: true});'), testCase(false, 't.notThrows(Promise.resolve());'), @@ -80,7 +81,6 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.true(true);'), testCase(false, 't.truthy(\'unicorn\');'), testCase(false, 't.snapshot(value);'), - testCase(false, 't.like({}, {});'), // Shouldn't be triggered since it's not a test file testCase(false, 't.true(true, \'message\');', [], false), @@ -99,6 +99,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.not(\'not\', \'same\', \'message\');'), testCase('always', 't.deepEqual({}, {}, \'message\');'), testCase('always', 't.notDeepEqual({}, {a: true}, \'message\');'), + testCase('always', 't.like({}, {}, \'message\');'), testCase('always', 't.throws(Promise.reject(), Error, \'message\');'), testCase('always', 't.notThrows(Promise.resolve(), \'message\');'), testCase('always', 't.regex(a, /a/, \'message\');'), @@ -107,7 +108,6 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.skip.is(\'same\', \'same\', \'message\');'), testCase('always', 't.is.skip(\'same\', \'same\', \'message\');'), testCase('always', 't.snapshot(value, \'message\');'), - testCase('always', 't.like({}, {}, \'message\');'), testCase('always', 't.teardown(() => {});'), testCase('always', 't.timeout(100, \'message\');'), testCase('always', 't.try(tt => tt.pass());'), @@ -132,6 +132,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.not(\'not\', \'same\');'), testCase('never', 't.deepEqual({}, {});'), testCase('never', 't.notDeepEqual({}, {a: true});'), + testCase('never', 't.like({}, {});'), testCase('never', 't.throws(Promise.reject());'), testCase('never', 't.throws(Promise.reject(), Error);'), testCase('never', 't.notThrows(Promise.resolve());'), @@ -141,7 +142,6 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.skip.is(\'same\', \'same\');'), testCase('never', 't.is.skip(\'same\', \'same\');'), testCase('never', 't.snapshot(value);'), - testCase('never', 't.like({}, {});'), testCase('never', 't.teardown(() => {});'), testCase('never', 't.timeout(100);'), testCase('never', 't.try(tt => tt.pass());'), @@ -186,6 +186,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.not(\'not\');', tooFewError(2)), testCase(false, 't.deepEqual({});', tooFewError(2)), testCase(false, 't.notDeepEqual({});', tooFewError(2)), + testCase(false, 't.like({});', tooFewError(2)), testCase(false, 't.throws();', tooFewError(1)), testCase(false, 't.notThrows();', tooFewError(1)), testCase(false, 't.regex(a);', tooFewError(2)), @@ -194,7 +195,6 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.skip.is(\'same\');', tooFewError(2)), testCase(false, 't.is.skip(\'same\');', tooFewError(2)), testCase(false, 't.snapshot();', tooFewError(1)), - testCase(false, 't.like({});', tooFewError(2)), testCase(false, 't.teardown();', tooFewError(1)), testCase(false, 't.timeout();', tooFewError(1)), testCase(false, 't.try();', tooFewError(1)), @@ -211,6 +211,7 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.not(\'not\', \'same\', \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.deepEqual({}, {}, \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.notDeepEqual({}, {a: true}, \'message\', \'extra argument\');', tooManyError(3)), + testCase(false, 't.like({}, {}, \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.throws(Promise.reject(), Error, \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.notThrows(Promise.resolve(), \'message\', \'extra argument\');', tooManyError(2)), testCase(false, 't.regex(a, /a/, \'message\', \'extra argument\');', tooManyError(3)), @@ -219,7 +220,6 @@ ruleTester.run('assertion-arguments', rule, { testCase(false, 't.skip.is(\'same\', \'same\', \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.is.skip(\'same\', \'same\', \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.snapshot(value, \'message\', \'extra argument\');', tooManyError(2)), - testCase(false, 't.like({}, {}, \'message\', \'extra argument\');', tooManyError(3)), testCase(false, 't.teardown(() => {}, \'extra argument\');', tooManyError(1)), testCase(false, 't.timeout(1, \'message\', \'extra argument\');', tooManyError(2)), @@ -233,6 +233,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.not(\'not\', \'same\');', missingError), testCase('always', 't.deepEqual({}, {});', missingError), testCase('always', 't.notDeepEqual({}, {a: true});', missingError), + testCase('always', 't.like({}, {});', missingError), testCase('always', 't.throws(Promise.reject());', missingError), testCase('always', 't.throws(Promise.reject(), Error);', missingError), testCase('always', 't.notThrows(Promise.resolve());', missingError), @@ -242,8 +243,6 @@ ruleTester.run('assertion-arguments', rule, { testCase('always', 't.skip.is(\'same\', \'same\');', missingError), testCase('always', 't.is.skip(\'same\', \'same\');', missingError), testCase('always', 't.snapshot(value);', missingError), - testCase('always', 't.like({}, {});', missingError), - testCase('never', 't.pass(\'message\');', foundError), testCase('never', 't.fail(\'message\');', foundError), testCase('never', 't.truthy(\'unicorn\', \'message\');', foundError), @@ -254,6 +253,7 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.not(\'not\', \'same\', \'message\');', foundError), testCase('never', 't.deepEqual({}, {}, \'message\');', foundError), testCase('never', 't.notDeepEqual({}, {a: true}, \'message\');', foundError), + testCase('never', 't.like({}, {}, \'message\');', foundError), testCase('never', 't.throws(Promise.reject(), Error, \'message\');', foundError), testCase('never', 't.notThrows(Promise.resolve(), \'message\');', foundError), testCase('never', 't.regex(a, /a/, \'message\');', foundError), @@ -262,7 +262,6 @@ ruleTester.run('assertion-arguments', rule, { testCase('never', 't.skip.is(\'same\', \'same\', \'message\');', foundError), testCase('never', 't.is.skip(\'same\', \'same\', \'message\');', foundError), testCase('never', 't.snapshot(value, \'message\');', foundError), - testCase('never', 't.like({}, {}, \'message\');', foundError), testCase(false, 't.end(\'too many\', \'arguments\');', tooManyError(1)), testCase(false, 't.skip.end(\'too many\', \'arguments\');', tooManyError(1)), From a00c36ef58f2443218ab5a66d3224c5efb066697 Mon Sep 17 00:00:00 2001 From: ninevra Date: Sat, 18 Jul 2020 23:42:20 -0700 Subject: [PATCH 7/7] refactor: reorder assertion list for consistency --- test/prefer-power-assert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/prefer-power-assert.js b/test/prefer-power-assert.js index 74ccddff..ee6a11e9 100644 --- a/test/prefer-power-assert.js +++ b/test/prefer-power-assert.js @@ -64,8 +64,8 @@ function testAllowedMethod(methodName) { const allowedMethods = [ 'assert(foo)', 'deepEqual(foo, bar)', - 'like(foo, bar)', 'notDeepEqual(foo, bar)', + 'like(foo, bar)', 'throws(block)', 'notThrows(block)', 'pass(foo)',