# Fixture

Tests an aggregate in isolation: given these events, when this command runs, what happens? The moleculer-cqrs `CQRSFixture`, as a chain that runs when it is yielded:

```ts
yield* Fixture.make(Todo)
  .givenEvents([created])
  .when("deleteTodo", { message: "Done" })
  .expectEvent("TodoDeleted")
  .inspectState((state) => assert.strictEqual(state.status, "deleted"))
```

Commands run through the real [AggregateService](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/) on an in-memory store, so payload validation and event encoding are exercised too.

The history can include events stored in older versions of their schema, made with `Aggregate.historical`, which then go through the same upcasting as events read from a real store.

## Classes

### ExpectationFailed

Defined in: [src/Fixture.ts:31](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L31)

Raised as a defect, so a command’s error channel only holds what the command can do.

#### Extends

* `object` & `YieldableError`<`this`>

#### Constructors

##### Constructor

> **new ExpectationFailed**(…`args`): [`ExpectationFailed`](https://effect-cqrs.dambox.ch/reference/api/fixture/#expectationfailed)

Defined in: node_modules/.pnpm/effect\@4.0.6/node_modules/effect/dist/Schema.d.ts:10979

###### Parameters

###### args

…\[`props`: `object`, `options?`: `MakeOptions`]

###### Returns

[`ExpectationFailed`](https://effect-cqrs.dambox.ch/reference/api/fixture/#expectationfailed)

###### Inherited from

`Schema.TaggedError<ExpectationFailed>()("ExpectationFailed", { message: Schema.String, expected: Schema.Unknown, actual: Schema.Unknown }).constructor`

#### Properties

##### actual

> `readonly` **actual**: `unknown` = `Schema.Unknown`

Defined in: [src/Fixture.ts:34](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L34)

###### Inherited from

`Schema.TaggedError<ExpectationFailed>()("ExpectationFailed", { message: Schema.String, expected: Schema.Unknown, actual: Schema.Unknown }).actual`

##### expected

> `readonly` **expected**: `unknown` = `Schema.Unknown`

Defined in: [src/Fixture.ts:33](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L33)

###### Inherited from

`Schema.TaggedError<ExpectationFailed>()("ExpectationFailed", { message: Schema.String, expected: Schema.Unknown, actual: Schema.Unknown }).expected`

##### message

> **message**: `string` = `Schema.String`

Defined in: [src/Fixture.ts:32](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L32)

###### Inherited from

`Schema.TaggedError<ExpectationFailed>()("ExpectationFailed", { message: Schema.String, expected: Schema.Unknown, actual: Schema.Unknown }).message`

## Interfaces

### Fixture

Defined in: [src/Fixture.ts:97](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L97)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

#### Properties

##### state

> `readonly` **state**: `Effect`<[`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>, [`ReadError`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#readerror), [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:103](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L103)

The state after the given events, without running a command.

#### Methods

##### checkInvariants()

> **checkInvariants**(`options`): `Effect`<`void`, `never`, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:123](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L123)

Runs random sequences of commands from the given history and checks that the invariant holds after each one that succeeds. Commands that fail are part of the game and are skipped. A violation dies with [ExpectationFailed](https://effect-cqrs.dambox.ch/reference/api/fixture/#expectationfailed), holding the shortest sequence found that breaks it.

###### Parameters

###### options

[`InvariantOptions`](https://effect-cqrs.dambox.ch/reference/api/fixture/#invariantoptions)<`A`>

###### Returns

`Effect`<`void`, `never`, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

##### given()

> **given**(`events`): [`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

Defined in: [src/Fixture.ts:99](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L99)

Replaces the history the next command runs against.

###### Parameters

###### events

readonly [`GivenEvent`](https://effect-cqrs.dambox.ch/reference/api/fixture/#givenevent)<`A`>\[]

###### Returns

[`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

##### givenEvents()

> **givenEvents**(`events?`, `aggregateId?`): [`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

Defined in: [src/Fixture.ts:101](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L101)

Like `given`, starting from an empty history by default and optionally switching aggregate id.

###### Parameters

###### events?

readonly [`GivenEvent`](https://effect-cqrs.dambox.ch/reference/api/fixture/#givenevent)<`A`>\[]

###### aggregateId?

`string`

###### Returns

[`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

##### inspectState()

> **inspectState**(`check`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`ReadError`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#readerror), [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:105](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L105)

Passes the state after the given events to a callback, which throws to fail the test.

###### Parameters

###### check

(`state`) => `void`

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`ReadError`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#readerror), [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

##### when()

> **when**<`K`>(`command`, `payload`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:108](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L108)

###### Type Parameters

###### K

`K` *extends* `string`

###### Parameters

###### command

`K`

###### payload

[`Payload`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payload-6)<`A`, `K`>

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

##### whenFails()

> **whenFails**<`K`>(`command`, `payload`): `Effect`<[`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `never`, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:113](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L113)

Runs a command that is expected to fail and returns the error. Dies if it succeeds.

###### Type Parameters

###### K

`K` *extends* `string`

###### Parameters

###### command

`K`

###### payload

[`Payload`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payload-6)<`A`, `K`>

###### Returns

`Effect`<[`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `never`, [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

***

### InvariantOptions

Defined in: [src/Fixture.ts:56](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L56)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

#### Properties

##### check?

> `readonly` `optional` **check?**: `CheckOptions`

Defined in: [src/Fixture.ts:71](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L71)

Passed on to `Arbitrary.checkEffect`, for the number of runs or a seed.

##### commands?

> `readonly` `optional` **commands?**: { readonly \[K in string]?: false | Arbitrary\<Payload\<A, K>> }

Defined in: [src/Fixture.ts:63](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L63)

How to generate each command’s payload. By default it comes from the payload schema. `false` leaves a command out.

##### invariant

> `readonly` **invariant**: (`state`) => `boolean`

Defined in: [src/Fixture.ts:58](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L58)

Must hold for the given state and after every command that succeeds.

###### Parameters

###### state

[`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>

###### Returns

`boolean`

##### maxCommands?

> `readonly` `optional` **maxCommands?**: `number`

Defined in: [src/Fixture.ts:69](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L69)

The longest sequence of commands to try. Defaults to 20.

***

### Outcome

Defined in: [src/Fixture.ts:37](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L37)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

#### Properties

##### events

> `readonly` **events**: readonly [`Event`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#event-2)<`A`>\[]

Defined in: [src/Fixture.ts:38](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L38)

##### fixture

> `readonly` **fixture**: [`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

Defined in: [src/Fixture.ts:42](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L42)

Continues from here, with this outcome’s events as the new history.

##### state

> `readonly` **state**: [`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>

Defined in: [src/Fixture.ts:39](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L39)

##### version

> `readonly` **version**: `number`

Defined in: [src/Fixture.ts:40](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L40)

***

### Scenario

Defined in: [src/Fixture.ts:78](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L78)

The steps so far. Nothing runs until it is yielded or run as an Effect, which produces the [Outcome](https://effect-cqrs.dambox.ch/reference/api/fixture/#outcome) of the last command.

#### Extends

* `Effect`<[`Outcome`](https://effect-cqrs.dambox.ch/reference/api/fixture/#outcome)<`A`>, `E`, `R`>

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

##### E

`E`

##### R

`R`

#### Methods

##### expectEvent()

> **expectEvent**(`event`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

Defined in: [src/Fixture.ts:90](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L90)

Expects the last command to have emitted exactly this event.

###### Parameters

###### event

[`ExpectedEvent`](https://effect-cqrs.dambox.ch/reference/api/fixture/#expectedevent)<`A`>

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

##### expectEvents()

> **expectEvents**(`events`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

Defined in: [src/Fixture.ts:92](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L92)

Expects the last command to have emitted exactly these events, in order.

###### Parameters

###### events

readonly [`ExpectedEvent`](https://effect-cqrs.dambox.ch/reference/api/fixture/#expectedevent)<`A`>\[]

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

##### inspectState()

> **inspectState**(`check`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

Defined in: [src/Fixture.ts:94](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L94)

Passes the current state to a callback, which throws to fail the test.

###### Parameters

###### check

(`state`) => `void`

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, `E`, `R`>

##### when()

> **when**<`K`>(`command`, `payload`): [`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | `E` | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `R` | [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:80](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L80)

Runs another command on top of the previous one.

###### Type Parameters

###### K

`K` *extends* `string`

###### Parameters

###### command

`K`

###### payload

[`Payload`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payload-6)<`A`, `K`>

###### Returns

[`Scenario`](https://effect-cqrs.dambox.ch/reference/api/fixture/#scenario)<`A`, [`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | `E` | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `R` | [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

##### whenFails()

> **whenFails**<`K`>(`command`, `payload`): `Effect`<[`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `E`, `R` | [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

Defined in: [src/Fixture.ts:85](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L85)

Runs a command that is expected to fail and returns the error. Dies if it succeeds.

###### Type Parameters

###### K

`K` *extends* `string`

###### Parameters

###### command

`K`

###### payload

[`Payload`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payload-6)<`A`, `K`>

###### Returns

`Effect`<[`CommandFailure`](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/#commandfailure) | [`CommandError`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commanderror)<`A`, `K`>, `E`, `R` | [`Context`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#context)<`A`>>

## Type Aliases

### ExpectedEvent

> **ExpectedEvent**<`A`> = [`Event`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#event-2)<`A`> | [`Event`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#event-2)<`A`>\[`"_tag"`]

Defined in: [src/Fixture.ts:46](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L46)

An event to compare with, or only its tag when the rest doesn’t matter.

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### GivenEvent

> **GivenEvent**<`A`> = [`Event`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#event-2)<`A`> | [`Historical`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#historical)

Defined in: [src/Fixture.ts:49](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L49)

An event in today’s shape, or one stored in an older version of its schema.

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Step

> **Step**<`A`> = `{ readonly [K in CommandName<A>]: { command: K; payload: Payload<A, K> } }`\[[`CommandName`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandname-1)<`A`>]

Defined in: [src/Fixture.ts:52](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L52)

One generated step of [Fixture.checkInvariants](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture).

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

## Functions

### make()

> **make**<`A`>(`aggregate`, `options?`): [`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>

Defined in: [src/Fixture.ts:188](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Fixture.ts#L188)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

#### Parameters

##### aggregate

`A`

##### options?

###### aggregateId?

`string`

###### events?

readonly [`GivenEvent`](https://effect-cqrs.dambox.ch/reference/api/fixture/#givenevent)<`A`>\[]

#### Returns

[`Fixture`](https://effect-cqrs.dambox.ch/reference/api/fixture/#fixture)<`A`>
