Skip to content

Commit

Permalink
feat(sinon): Add @assertive-ts/sinon plugin (#118)
Browse files Browse the repository at this point in the history
  • Loading branch information
JoseLion authored Feb 15, 2024
1 parent 7dcef4c commit ca16230
Show file tree
Hide file tree
Showing 22 changed files with 1,858 additions and 85 deletions.
2 changes: 1 addition & 1 deletion examples/jest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"@assertive-ts/core": "workspace:^",
"@examples/symbol-plugin": "workspace:^",
"@types/jest": "^29.5.11",
"@types/node": "^20.10.5",
"@types/node": "^20.10.6",
"jest": "^29.7.0",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.2",
Expand Down
2 changes: 1 addition & 1 deletion examples/mocha/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"@assertive-ts/core": "workspace:^",
"@examples/symbol-plugin": "workspace:^",
"@types/mocha": "^10.0.6",
"@types/node": "^20.10.5",
"@types/node": "^20.10.6",
"mocha": "^10.2.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@
"test": "turbo run test"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.15.0",
"@typescript-eslint/parser": "^6.15.0",
"@typescript-eslint/eslint-plugin": "^6.17.0",
"@typescript-eslint/parser": "^6.17.0",
"eslint": "^8.56.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-etc": "^2.0.3",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsdoc": "^46.9.1",
"eslint-plugin-jsdoc": "^48.0.2",
"eslint-plugin-sonarjs": "^0.23.0",
"turbo": "^1.11.2",
"typescript": "^5.3.3"
Expand Down
4 changes: 2 additions & 2 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@
},
"devDependencies": {
"@types/mocha": "^10.0.6",
"@types/node": "^20.10.5",
"@types/node": "^20.10.6",
"@types/sinon": "^17.0.2",
"all-contributors-cli": "^6.26.1",
"mocha": "^10.2.0",
"semantic-release": "^22.0.12",
"semantic-release-yarn": "^3.0.2",
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"typedoc": "^0.25.4",
"typedoc": "^0.25.6",
"typedoc-plugin-markdown": "^3.17.1",
"typedoc-plugin-merge-modules": "^5.1.0",
"typescript": "^5.3.3"
Expand Down
9 changes: 9 additions & 0 deletions packages/sinon/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://json.schemastore.org/mocharc",
"extension": ["ts"],
"recursive": true,
"require": [
"ts-node/register",
"test/hooks.ts"
]
}
15 changes: 15 additions & 0 deletions packages/sinon/.releaserc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"$schema": "https://json.schemastore.org/semantic-release",
"branches": [
"main"
],
"plugins": [
["@semantic-release/commit-analyzer", {
"releaseRules": [{ "scope": "!sinon", "release": false }]
}],
"@semantic-release/release-notes-generator",
"semantic-release-yarn",
"@semantic-release/github"
],
"tagFormat": "sinon/v${version}"
}
107 changes: 107 additions & 0 deletions packages/sinon/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Assertive.ts Sinon

An Assertive.ts plugin to match over [Sinon.js](https://sinonjs.org/) spies, stubs, mocks, and fakes.

## Requirements

- **@assertive-ts/core:** >=2.0.0
- **sinon:** >=15.2.0

## Install

```sh
npm install --save-dev @assertive-ts/sinon
```

Or:

```sh
yarn add --dev @assertive-ts/sinon
```

## API Reference

You can find the full API reference [here](https://stackbuilders.github.io/assertive-ts/docs/sinon/build/) 📚

## Usage

You just need to load the plugin in a file that runs before the tests execution, like a `setup.ts` or something like that:

```ts
// setup.ts

import { usePlugin } from "@assertive-ts/core";
import { SinonPlugin } from "@assertive-ts/sinon";

usePlugin(SinonPlugin);

// ...rest of your setup
```

And that's it! The extra types will be automatically added as well so you won't need to change anything on TypeScript's side. Now you can use the `expect(..)` function to assert over Sinon spies, stubs, mocks, and fakes.

```ts
import { expect } from "@assertive-ts/core";
import Sinon from "sinon";

const spy = Sinon.spy(launchRockets);

expect(spy).toBeCalled(3); // exactly 3 times

expect(spy).toBeCalledTwice();

expect(spy).toBeCalledAtLeast(2);

expect(spy).toBeCalledAtMost(3);

expect(spy).toHaveArgs(10, "long-range");

expect(spy).toThrow();
```

The assertions above act over any of the calls made to the spy. You can get more specific matchers if you assert over a single spy call:

```ts
import { expect } from "@assertive-ts/core";
import Sinon from "sinon";

const spy = Sinon.spy(launchRockets);

expect(spy.firstCall).toHaveArgs(5, "short-range");

expect(spy.firstCall).toReturn({ status: "ok" });

expect(spy.firstCall) // more specific matchers over a single call
.toThrowError(InvarianError)
.toHaveMessage("Something went wrong...");

// or...

expect(spy)
.call(1)
.toThrowError(InvarianError)
.toHaveMessage("Something went wrong...");

// or even better...

expect(spy)
.toBeCalledOnce()
.toThrowError(InvarianError)
.toHaveMessage("Something went wrong...");
```

Notice how `call(..)` and `.toBeCalledOnce()` methods return an assertion over the single call, this way you can chain matchers instead of writing more statements.

## License

MIT, see [the LICENSE file](https://github.com/stackbuilders/assertive-ts/blob/main/packages/sinon/LICENSE).

## Contributing

Do you want to contribute to this project? Please take a look at our [contributing guideline](https://github.com/stackbuilders/assertive-ts/blob/main/docs/CONTRIBUTING.md) to know how you can help us build it.

---

<img src="https://www.stackbuilders.com/media/images/Sb-supports.original.png" alt="Stack Builders" width="50%" />

[Check out our libraries](https://github.com/stackbuilders/) | [Join our team](https://www.stackbuilders.com/join-us/)
71 changes: 71 additions & 0 deletions packages/sinon/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"name": "@assertive-ts/sinon",
"version": "0.0.0",
"description": "Assertive.ts plugin for Sinon assertions",
"repository": "[email protected]:stackbuilders/assertive-ts.git",
"homepage": "https://stackbuilders.github.io/assertive-ts/",
"author": "Stack Builders <[email protected]>",
"license": "MIT",
"keywords": [
"assertions",
"assertive-ts",
"testing",
"testing-tools",
"type-safety",
"typescript",
"sinon",
"plugin"
],
"main": "./dist/main.js",
"types": "./dist/main.d.ts",
"files": [
"dist/",
"src/"
],
"engines": {
"node": ">=16"
},
"packageManager": "[email protected]",
"scripts": {
"build": "tsc -p tsconfig.prod.json",
"check": "yarn compile && yarn test --forbid-only",
"compile": "tsc -p tsconfig.json",
"docs": "typedoc",
"release": "semantic-release",
"test": "NODE_ENV=test mocha"
},
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"devDependencies": {
"@assertive-ts/core": "workspace:^",
"@types/mocha": "^10.0.6",
"@types/node": "^20.10.6",
"@types/sinon": "^17.0.2",
"mocha": "^10.2.0",
"semantic-release": "^22.0.12",
"semantic-release-yarn": "^3.0.2",
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"typedoc": "^0.25.7",
"typedoc-plugin-markdown": "^3.17.1",
"typedoc-plugin-merge-modules": "^5.1.0",
"typescript": "^5.3.3"
},
"peerDependencies": {
"@assertive-ts/core": ">=2.0.0",
"sinon": ">=15.2.0"
},
"peerDependenciesMeta": {
"@assertive-ts/core": {
"optional": false
},
"sinon": {
"optional": true
}
},
"publishConfig": {
"access": "public",
"provenance": true
}
}
Loading

0 comments on commit ca16230

Please sign in to comment.