{"id":21414874,"url":"https://github.com/magic/test","last_synced_at":"2025-06-12T18:06:06.608Z","repository":{"id":47366231,"uuid":"127304325","full_name":"magic/test","owner":"magic","description":"ecmascript module testing library. no transpilation of source or tests needed.","archived":false,"fork":false,"pushed_at":"2025-01-20T13:46:36.000Z","size":2636,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-01T16:41:05.858Z","etag":null,"topics":["magic","testing"],"latest_commit_sha":null,"homepage":"https://magic.github.io/test","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/magic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-29T14:36:01.000Z","updated_at":"2025-01-20T13:46:36.000Z","dependencies_parsed_at":"2024-06-21T05:44:57.281Z","dependency_job_id":"46f9e60c-cfa3-4ae3-b78e-a74d909d8e4b","html_url":"https://github.com/magic/test","commit_stats":null,"previous_names":[],"tags_count":63,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magic%2Ftest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magic%2Ftest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magic%2Ftest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magic%2Ftest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/magic","download_url":"https://codeload.github.com/magic/test/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245699262,"owners_count":20657987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["magic","testing"],"created_at":"2024-11-22T18:34:22.272Z","updated_at":"2025-03-26T17:21:26.144Z","avatar_url":"https://github.com/magic.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @magic/test\n\ndeclaratively test your ecmascript module files\n\nno transpiling of either your codebase nor the tests.\n\nincredibly fast.\n\n[html docs](https://magic.github.io/test)\n\n[![NPM version][npm-image]][npm-url]\n[![Linux Build Status][travis-image]][travis-url]\n[![Windows Build Status][appveyor-image]][appveyor-url]\n[![Coverage Status][coveralls-image]][coveralls-url]\n[![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]\n[![Known Vulnerabilities][snyk-image]][snyk-url]\n\n[npm-image]: https://img.shields.io/npm/v/@magic/test.svg\n[npm-url]: https://www.npmjs.com/package/@magic/test\n[travis-image]: https://img.shields.io/travis/com/magic/test/master\n[travis-url]: https://travis-ci.com/magic/test\n[appveyor-image]: https://img.shields.io/appveyor/ci/magic/test/master.svg\n[appveyor-url]: https://ci.appveyor.com/project/magic/test/branch/master\n[coveralls-image]: https://coveralls.io/repos/github/magic/test/badge.svg\n[coveralls-url]: https://coveralls.io/github/magic/test\n[greenkeeper-image]: https://badges.greenkeeper.io/magic/test.svg\n[greenkeeper-url]: https://badges.greenkeeper.io/magic/test.svg\n[snyk-image]: https://snyk.io/test/github/magic/test/badge.svg\n[snyk-url]: https://snyk.io/test/github/magic/test\n\n- [install](#install)\n- [npm scripts](#npm-scripts)\n- [usage](#usage)\n- [data/fs driven test suites](#test-suites)\n- [writing tests](#tests)\n  - [js types](#tests-types)\n  - [multiple tests in one file](#tests-multiple)\n  - [promises](#tests-promises)\n  - [callback functions](#tests-cb)\n  - [run function before / after individual tests](#tests-hooks)\n  - [run function before / after suite of tests](#tests-suite-hooks)\n  - [test @magic-modules](#tests-magic-modules)\n- [utility functions](#lib)\n  - [curry](#lib-curry)\n  - [vals](#lib-vals)\n  - [promises](#lib-promises)\n  - [css](#lib-css)\n  - [tryCatch](#lib-trycatch)\n- [Cli / Js Api Usage](#usage)\n  - [js api](#usage-js)\n  - [cli](#usage-cli)\n  - [npm i -g](#usage-global)\n\n#### \u003ca name=\"install\"\u003e\u003c/a\u003egetting started\n\nbe in a nodejs project.\n\n```bash\nnpm i --save-dev @magic/test\n\nmkdir test\n```\n\ncreate test/index.js\n\n```javascript\nimport yourTest from '../path/to/your/file.js'\n\nexport default [\n  { fn: () =\u003e true, expect: true, info: 'true is true' },\n  // note that the function will be called automagically\n  { fn: yourTest, expect: true, info: 'hope this will work ;)' },\n]\n```\n\n###### \u003ca name=\"npm-scripts\"\u003e\u003c/a\u003enpm run scripts\n\nedit package.json:\n\n```json5\n{\n  \"scripts\": {\n    \"test\": \"t -p\", // quick test, only failing tests log\n    \"coverage\": \"t\", // get full test output and coverage reports\n  }\n}\n\nrepeated for easy copy pasting (without comments):\n  \"scripts\": {\n    \"test\": \"t -p\",\n    \"coverage\": \"t\",\n  }\n```\n\nrun the test:\n\n```bash\n  npm test\n```\n\nexample output:\n(failing tests will print, passing tests are silent)\n\n```\n###  Testing package: @magic/test\n\nRan 2 tests. Passed 2/2 100%\n```\n\nrun coverage reports and get full test report including from passing tests:\n\n```bash\n  npm run coverage\n```\n\n##### \u003ca name=\"test-suites\"\u003e\u003c/a\u003edata/fs driven test suite creation:\n\n- **expectations for optimal test messages:**\n- src and test directories have the same structure and files.\n- tests one src file per test file.\n- tests one function per suite\n- tests one feature per test\n\n###### Filesystem based naming\n\nthe following directory structure:\n\n```\n./test/\n  ./suite1.js\n  ./suite2.js\n```\n\nhas the same result as exporting the following from ./test/index.js\n\n###### Data driven naming\n\n```javascript\nimport suite1 from './suite1'\nimport suite2 from './suite2'\n\nexport default {\n  suite1,\n  suite2,\n}\n```\n\n##### Important\n\nif test/index.js exists, no other files will be loaded.\n\nif test/lib/index.js exists, no other files from that subdirectory will be loaded.\n\n##### \u003ca name=\"tests\"\u003e\u003c/a\u003esingle test, literal value, function or promise\n\n```javascript\nexport default { fn: true, expect: true, info: 'expect true to be true' }\n\n// expect: true is the default and can be omitted\nexport default { fn: true, info: 'expect true to be true' }\n\n// if fn is a function expect is the returned value of the function\nexport default { fn: () =\u003e false, expect: false, info: 'expect true to be true' }\n\n// if expect is a function the return value of the test get passed to it\nexport default { fn: false, expect: t =\u003e t === false, info: 'expect true to be true' }\n\n// if fn is a promise the resolved value will be returned\nexport default { fn: new Promise(r =\u003e r(true)), expect: true, info: 'expect true to be true' }\n\n// if expects is a promise it will resolve before being compared to the fn return value\nexport default { fn: true, expect: new Promise(r =\u003e r(true)), info: 'expect true to be true' }\n\n// callback functions can be tested easily too:\nimport { promise } from '@magic/test'\nconst fnWithCallback = (err, arg, cb) =\u003e cb(err, arg)\nexport default { fn: promise(fnWithCallback(null, 'arg', (e, a) =\u003e a)), expect: 'arg' }\n```\n\n###### \u003ca name=\"tests-types\"\u003e\u003c/a\u003e testing types\n\ntypes can be compared using [@magic/types](https://github.com/magic/types)\n\n@magic/types is a full featured and thoroughly tested type library\nwithout dependencies.\n\nit is exported from this library for convenience.\n\n```javascript\nimport { is } from '@magic/test'\nexport default [\n  { fn: () =\u003e 'string', expect: is.string, info: 'test if a function returns a string' },\n  {\n    fn: () =\u003e 'string',\n    expect: is.length.equal(6),\n    info: 'test length of returned value',\n  },\n  // !!! Testing for deep equality. simple.\n  {\n    fn: () =\u003e [1, 2, 3],\n    expect: is.deep.equal([1, 2, 3]),\n    info: 'deep compare arrays/objects for equality',\n  },\n  {\n    fn: () =\u003e {\n      key: 1\n    },\n    expect: is.deep.different({ value: 1 }),\n    info: 'deep compare arrays/objects for difference',\n  },\n]\n```\n\n###### caveat:\n\nif you want to test if a function is a function, you need to wrap the function\n\n```javascript\nimport { is } from '@magic/test'\nconst fnToTest = () =\u003e {}\nexport default {\n  fn: () =\u003e fnToTest,\n  expect: is.function,\n  info: 'function is a function',\n}\n```\n\n##### \u003ca name=\"tests-multiple\"\u003e\u003c/a\u003e multiple tests\n\nmultiple tests can be created by exporting an array of single test objects.\n\n```javascript\nexport default {\n  multipleTests: [\n    { fn: () =\u003e true, expect: true, info: 'expect true to be true' },\n    { fn: () =\u003e false, expect: false, info: 'expect false to be false' },\n  ],\n}\n```\n\n##### \u003ca name=\"tests-promises\"\u003e\u003c/a\u003epromises\n\n```javascript\nimport { promise, is } from '@magic/test'\n\nexport default [\n  // kinda clumsy, but works. until you try handling errors.\n  {\n    fn: new Promise(cb =\u003e setTimeOut(() =\u003e cb(true), 2000)),\n    expect: true,\n    info: 'handle promises',\n  },\n  // better!\n  {\n    fn: promise(cb =\u003e setTimeOut(() =\u003e cb(null, true), 200)),\n    expect: true,\n    info: 'handle promises in a nicer way',\n  },\n  {\n    fn: promise(cb =\u003e setTimeOut(() =\u003e cb(new Error('error')), 200)),\n    expect: is.error,\n    info: 'handle promise errors in a nice way',\n  },\n]\n```\n\n##### \u003ca name=\"tests-cb\"\u003e\u003c/a\u003ecallback functions\n\n```javascript\nimport { promise, is } from '@magic/test'\n\nconst fnWithCallback = (err, arg, cb) =\u003e cb(err, arg)\n\nexport default [\n  {\n    fn: promise(cb =\u003e fnWithCallback(null, true, cb)),\n    expect: true\n    info: 'handle callback functions as promises',\n  },\n  {\n    fn: promise(cb =\u003e fnWithCallback(new Error('oops'), true, cb)),\n    expect: is.error,\n    info: 'handle callback function error as promise',\n  },\n]\n```\n\n##### \u003ca name=\"tests-hooks\"\u003e\u003c/a\u003erun functions before and/or after individual test\n\n```javascript\nconst after = () =\u003e {\n  global.testing = 'Test has finished, cleanup.'\n}\n\nconst before = () =\u003e {\n  global.testing = false\n\n  // if a function gets returned,\n  // this function will be executed once the test finished.\n  return after\n}\n\nexport default [\n  {\n    fn: () =\u003e { global.testing = 'changed in test' },\n    // if before returns a function, it will execute after the test.\n    before,\n    after,\n    expect: () =\u003e global.testing === 'changed in test',\n  },\n```\n\n##### \u003ca name=\"tests-suite-hooks\"\u003e\u003c/a\u003erun functions before and/or after a suite of tests\n\n```javascript\nconst afterAll = () =\u003e {\n  // Test has finished, cleanup.'\n  global.testing = undefined\n}\n\nconst beforeAll = () =\u003e {\n  global.testing = false\n\n  // if a function gets returned,\n  // this function will be executed once the test suite finished.\n  return afterAll\n}\n\nexport default [\n  {\n    fn: () =\u003e { global.testing = 'changed in test' },\n    // if beforeAll returns a function, it will execute after the test suite.\n    beforeAll,\n    // this is optional and can be omitted if beforeall returns a function.\n    // in this example, afterAll will trigger twice.\n    afterAll,\n    expect: () =\u003e global.testing === 'changed in test',\n  },\n```\n\n##### \u003ca name=\"tests-magic-modules\"\u003e\u003c/a\u003etest @magic-modules\n\n@magic-modules assume all html tags to be globally defined.\nto create those globals for your test and check if a @magic-module returns the correct markup, just add an html: true flag to the test:\n\n```javascript\nexport default [\n  { fn: () =\u003e i('testing'), expect: ['i', 'testing'], info: '@magic/test can now test html' },\n]\n```\n\n#### \u003ca name=\"lib\"\u003eUtility Belt\n\n@magic/test exports some utility functions that make working with complex test workflows simpler.\n\n###### \u003ca name=\"lib-curry\"\u003e\u003c/a\u003ecurry\n\nCurrying can be used to split the arguments of a function into multiple nested functions.\nThis helps if you have a function with complicated arguments that you just want to quickly shim.\n\n```javascript\nimport { curry } from '@magic/test'\n\nconst compare = (a, b) =\u003e a === b\nconst curried = curry(compare)\nconst shimmed = curried('shimmed_value')\n\nexport default {\n  fn: shimmed('shimmed_value'),\n  expect: true,\n  info: 'expect will be called with a and b and a will equal b',\n}\n```\n\n###### \u003ca name=\"lib-vals\"\u003e\u003c/a\u003e vals\n\nexports some javascript types. more to come. will sometime in the future be the base of a fuzzer.\n\n##### \u003ca name=\"lib-promises\"\u003e\u003c/a\u003epromises\n\nHelper function to wrap nodejs callback functions and promises with ease.\nHandles the try/catch steps internally and returns a resolved or rejected promise.\n\n```javascript\nimport { promise, is } from '@magic/test'\n\nexport default [\n  {\n    fn: promise(cb =\u003e setTimeOut(() =\u003e cb(null, true), 200)),\n    expect: true,\n    info: 'handle promises in a nice way',\n  },\n  {\n    fn: promise(cb =\u003e setTimeOut(() =\u003e cb(new Error('error')), 200)),\n    expect: is.error,\n    info: 'handle promise errors in a nice way',\n  },\n]\n```\n\n##### \u003ca name=\"lib-css\"\u003e\u003c/a\u003ecss\n\nexports [@magic/css](https://github.com/magic/css)\nwhich allows parsing and stringification of css-in-js objects.\n\n###### \u003ca name=\"lib-trycatch\"\u003e\u003c/a\u003e tryCatch\n\nallows to catch and test functions without bubbling the errors up into the runtime\n\n```javascript\nimport { is, tryCatch } from '@magic/test'\nconst throwing = () =\u003e throw new Error('oops')\nconst healthy = () =\u003e true\n\nexport default [\n  {\n    fn: tryCatch(throwing()),\n    expect: is.error,\n    info: 'function throws an error',\n  },\n  {\n    fn: tryCatch(healthy()),\n    expect: true,\n    info: 'function does not throw',\n  },\n]\n```\n\n##### \u003ca name=\"lib-error\"\u003e\u003c/a\u003eerror\n\nexport [@magic/error](https://github.com/magic/error)\nwhich returns errors with optional names.\n\n```javascript\nimport { error } from '@magic/test'\n\nexport default [\n  {\n    fn: tryCatch(error('Message', 'E_NAME')),\n    expect: e =\u003e e.name === 'E_NAME' \u0026\u0026 e.message === 'Message',\n    info: 'Errors have messages and (optional) names.',\n  },\n]\n```\n\n#### \u003ca name=\"usage\"\u003e\u003c/a\u003eUsage\n\n#### \u003ca name=\"usage-js\"\u003e\u003c/a\u003ejs api:\n\n```javascript\n// test/index.js\n\nimport run from '@magic/test'\n\nconst tests = {\n  lib: [{ fn: () =\u003e true, expect: true, info: 'Expect true to be true' }],\n}\n\nrun(tests)\n```\n\n#### \u003ca name=\"usage-cli\"\u003e\u003c/a\u003ecli\n\n##### package.json (recommended):\n\nAdd the magic/test bin scripts to package.json\n\n```json\n{\n  \"scripts\": {\n    \"test\": \"t -p\",\n    \"coverage\": \"t\"\n  },\n  \"devDependencies\": {\n    \"@magic/test\": \"github:magic/test\"\n  }\n}\n```\n\nthen use the npm run scripts\n\n```bash\n  npm test\n  npm run coverage\n```\n\n##### \u003ca name=\"usage-global\"\u003e\u003c/a\u003eGlobally (not recommended):\n\nyou can of course install this library globally,\nbut the recommendation is to add the dependency and scripts to the package.json file.\n\nthis both explains to everyone that your app has this dependencies\nand keeps your bash free of clutter\n\n```bash\n  npm i -g magic/test\n\n  // run tests in production mode\n  t -p\n\n  // run tests in verbose mode\n  t\n```\n\nThis library tests itself, have a look at [the tests](https://github.com/magic/test/tree/master/test)\n\nCheckout [@magic/types](https://github.com/magic/types)\nand the other magic libraries for more test examples.\n\n### Changelog\n\n#### 0.1.0\n\nuse esmodules instead of commonjs.\n\n#### 0.1.1\n\nrework of bin scripts and update dependencies to esmodules\n\n#### 0.1.2\n\ncli now works on windows again (actually, this version is broken on all platforms.)\n\n#### 0.1.3\n\ncli now works everywhere\n\n#### 0.1.4\n\nnpm run scripts of @magic/test itself can be run on windows.\n\n#### 0.1.5\n\nuse ecmascript version of @magic/deep\n\n#### 0.1.6\n\n- update this readme and html docs.\n- tests should always process.exit(1) if they errored.\n\n#### 0.1.7\n\n- readded calls npm run script\n- updated c8\n\n#### 0.1.8\n\nupdate @magic/cli\n\n#### 0.1.9\n\n- test/beforeAll.mjs gets loaded separately if it exists and executed before all tests\n- test/afterAll.mjs gets loaded separately if it exists and executed after all tests\n- if the function exported from test/beforeAll.mjs returns another function,\n  this returned function will also be executed after all tests\n- export hyperapp beta 18\n\n#### 0.1.10\n\nnode 12.4.0 does not use --experimental-json-modules flag. removed it in 12.4+.\n\n#### 0.1.11\n\n- update prettier, coveralls\n- add and export @magic/css to test css validity\n\n#### 0.1.12\n\nupdate dependencies\n\n#### 0.1.13\n\nwindows support is back\n\n#### 0.1.14\n\nwindows support now supports index.mjs files that provide test structure\n\n#### 0.1.15\n\nupdate dependencies\n\n#### 0.1.16\n\nupdate @magic/cli for node 13 support.\n\n#### 0.1.17\n\nadd node 13 json support for coverage reports.\n\n#### 0.1.18\n\n- update dependencies\n- require node 12.13.0\n\n#### 0.1.19\n\nupdate dependencies\n\n#### 0.1.20\n\nupdate broken dependencies\n\n#### 0.1.21\n\nupdate @magic/cli to allow default args\n\n#### 0.1.22\n\nupdate dependencies\n\n#### 0.1.23\n\nupdate @magic dependencies to use npm packages instead of github\n\n#### 0.1.24\n\n- update @magic/css\n- update c8\n\n#### 0.1.25\n\n- currying now throws errors instead of returning them.\n- update @magic/css\n- update @magic/types which now uses @magic/deep for is.deep.eq and is.deep.diff\n\n#### 0.1.26\n\nremove commonjs support. node 13+ required. awesome.\n\n#### 0.1.27\n\nremove prettier from deps\n\n#### 0.1.28\n\n- package: engineStrict: true\n- update cli: missing @magic/cases dependency\n\n#### 0.1.29\n\nhelp text can show up when --help is used\n\n#### 0.1.30\n\nexport @magic/fs\n\n#### 0.1.31\n\nupdate dependencies\n\n#### 0.1.32\n\n- tests now work on windows \\o/\n- uncaught errors will cause tests to fail with process.exit(1)\n\n#### 0.1.33\n\nupdate exported dependencies\n\n#### 0.1.34\n\nfix: c8 needs \"report\" command now\n\n#### 0.1.35\n\n- fix: c8 errored if coverage dir did not exist\n- update dependencies\n\n#### 0.1.36\n\nc8: --exclude, --include and --all get applied correctly.\n\n#### 0.1.37\n\nfix: arguments for both node and c8 tests work. broken in 0.1.36\n\n#### 0.1.38\n\nupdate dependencies, minimist sec issue.\n\n#### 0.1.39\n\nupdate coveralls, fix minimist issue above.\n\n##### 0.1.40\n\nupdate dependencies\n\n##### 0.1.41\n\nupdate dependencies\n\n##### 0.1.42\n\nupdate dependencies\n\n##### 0.1.43\n\nupdate dependencies\n\n##### 0.1.44\n\nupdate dependencies\n\n##### 0.1.45\n\nsecurity fix: update dependencies, yargs-parser.\n\n##### 0.1.46\n\nupdate @magic/css\n\n##### 0.1.47\n\nupdate c8, yargs-parser\n\n##### 0.1.48\n\nbump required node version to 14.2.0\nupdate dependencies\n\n##### 0.1.49\n\nupdate @magic/css\n\n##### 0.1.50\n\n- remove @magic/css export\n- update c8\n\n##### 0.1.51\n\n- update dependencies\n\n##### 0.1.52\n\n- update dependencies\n- remove hyperapp from exports.\n\n##### 0.1.53\n\nupdate dependencies\n\n##### 0.1.54\n\nupdate dependencies\n\n##### 0.1.55\n\nupdate dependencies\n\n##### 0.1.56\n\nupdate dependencies\n\n##### 0.1.57\n\nupdate dependencies\n\n##### 0.1.58\n\nupdate dependencies\n\n##### 0.1.58\n\nupdate dependencies\n\n##### 0.1.59\n\nupdate dependencies\n\n##### 0.1.60\n\n- bump required node version to 14.15.4\n- update dependencies\n\n##### 0.1.61\n\nupdate dependencies\n\n##### 0.1.62\n\n- add html flag to tests, now @magic-modules can be tested \\o/\n- update dependencies\n\n##### 0.1.63\n\nupdate dependencies (c8)\n\n##### 0.1.64\n\nupdate dependencies (@magic/fs)\n\n##### 0.1.65\n\n- update dependencies\n- testing of @magic-modules is now built in.\n  if @magic/core is installed, the tests will \"just work\" and return html for @magic-modules\n\n##### 0.1.66\n\n- better handling if magic is not in use\n\n##### 0.1.67\n\n- silence errors if magic.js does not exist\n\n##### 0.1.68\n\nupdate @magic/core to fix tests if magic.js does not exist\n\n##### 0.1.69\n\nimport of magic config should work on windows\n\n##### 0.1.70\n\nupdate dependencies\n\n##### 0.1.71\n\nupdate dependencies\n\n##### 0.1.72\n\nupdate @magic/types and intermediate deps to avoid circular dependency\n\n##### 0.1.73\n\nupdate dependencies\n\n##### 0.1.74\n\nupdate dependencies\n\n##### 0.1.75\n\nupdate dependencies\n\n##### 0.1.76\n\nupdate dependencies\n\n##### 0.1.77\n\nupdate dependencies\n\n##### 0.2.0\n\n- update dependencies\n- version now tests spec and lib in a single run.\n\n##### 0.2.1\n\n- internal restructuring\n- tests now output their run duration\n- add @magic/error dependency and export it from index\n- index.js files have the same functionality as index.mjs files\n- update dependencies\n\n##### 0.2.2\n\nspec values can be functions, allowing arbitrary equality testing to be executed by @magic/test.version\n\n##### 0.2.3\n\nupdate dependencies\n\n##### 0.2.4\n\n- lib/version: spec can have objects defined with ['obj', false], which will test the parent to be an object,\n  but does not test the key/value pairs in the object.\n- maybeInjectMagic: made magic injection more robust and much faster if magic is not being used.\n- t -p now does not show the coverage information\n\n##### 0.2.5\n\n- update dependencies\n- @magic/core is a dev dependency now.\n\n##### 0.2.6\n\nupdate dependencies\n\n##### 0.2.7\n\n- update dependencies\n- replace coveralls with coveralls-next\n\n##### 0.2.8\n\nupdate dependencies\n\n##### 0.2.9\n\nupdate dependencies\n\n##### 0.2.10\n\n@magic/test can now test @magic/core again\n\n##### 0.2.11\n\nupdate dependencies\n\n##### 0.2.12\n\nupdate dependencies\n\n##### 0.2.13\n\nupdate dependencies\n\n##### 0.2.14\n\nupdate dependencies\n\n##### 0.2.15\n\n- update dependencies\n- percentage outputs print nicer numbers\n- added http export that allows http requests in tests, there might be dragons and future updates are expected. only supports get requests for now.\n\n##### 0.2.16\n\nupdate dependencies\n\n##### 0.2.17\n\n- remove calls and coveralls-next, c8 takes care of coverage.\n- update dependencies\n\n##### 0.2.18\n\n- add missing fs.statfs, fs.statfsSync and fs.promises.constants to test/spec\n- update dependencies\n\n##### 0.2.19\n\n- update dependencies\n- add unused http.post. probably should replace http with fetch...\n\n##### 0.2.20\n\n- update dependencies\n\n##### 0.2.21 - unreleased\n\n...\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagic%2Ftest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmagic%2Ftest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagic%2Ftest/lists"}