<!-- json
{
  "sourceId": "todo-app-test-pattern",
  "repositoryId": "travetto",
  "filePath": "related/todo-app/test/service.ts",
  "capabilityTags": ["test", "suite", "service"],
  "operationIds": ["generate-test-suite"],
  "applicability": ["sample-project"],
  "notes": [
    "Reference integration-focused suite layout with injected services."
  ]
}
-->

# todo-app-test-pattern

- Source: `related/todo-app/test/service.ts`
- Capability tags: test, suite, service
- Applicability: sample-project
- Notes:
  - Reference integration-focused suite layout with injected services.

## Reference Code

```typescript
import assert from 'node:assert';

import { Inject } from '@travetto/di';
import { MongoModelConfig, MongoModelService } from '@travetto/model-mongo';
import { Suite, Test } from '@travetto/test';

import { InjectableSuite } from '@travetto/di/support/test/suite.ts';
import { ModelSuite } from '@travetto/model/support/test/suite.ts';

import { Todo } from '../src/model.ts';
import type { TodoService } from '../src/service.ts';

@Suite()
@ModelSuite()
@InjectableSuite()
export class TodoTest {
  serviceClass = MongoModelService;
  configClass = MongoModelConfig;

  @Inject()
  service: TodoService;

  @Test('Create todo')
  async create() {
    const test = Todo.from({
      text: 'Sample Task'
    });

    const saved = await this.service.add(test);

    assert.ok(saved.id);
  }

  @Test('Complete todo')
  async complete() {
    const test = Todo.from({
      text: 'Sample Task'
    });

    const saved = await this.service.add(test);
    assert.ok(saved.id);

    let updated = await this.service.complete(saved.id);
    assert(updated.completed === true);

    updated = await this.service.complete(saved.id, false);
    assert(updated.completed === false);
  }

  @Test('Delete todo')
  async remove() {
    const test = Todo.from({
      text: 'Sample Task'
    });

    const saved = await this.service.add(test);
    assert.ok(saved.id);
    assert(test.text === 'Sample Task');

    await this.service.remove(saved.id);

    await assert.rejects(() => this.service.get(saved.id), /Todo with id .* not found/);
  }
}
```
