Awesome-claude-code create-mock-repository

Generates InMemory repository implementations for PHP 8.4 testing. Creates fake repositories with array storage, supporting CRUD operations and queries without database.

install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-mock-repository" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-mock-repository && rm -rf "$T"
manifest: skills/create-mock-repository/SKILL.md
source content

Mock Repository Generator

Generates InMemory (Fake) repository implementations for testing.

Characteristics

  • No database — stores entities in memory
  • Fast — no I/O operations
  • Isolated — fresh state per test
  • Deterministic — predictable behavior
  • Implements interface — same contract as real repository

Template

<?php

declare(strict_types=1);

namespace Tests\Fake;

use {RepositoryInterface};
use {Entity};
use {EntityId};

final class InMemory{Entity}Repository implements {RepositoryInterface}
{
    /** @var array<string, {Entity}> */
    private array $entities = [];

    public function save({Entity} $entity): void
    {
        $this->entities[$entity->id()->toString()] = $entity;
    }

    public function findById({EntityId} $id): ?{Entity}
    {
        return $this->entities[$id->toString()] ?? null;
    }

    public function delete({Entity} $entity): void
    {
        unset($this->entities[$entity->id()->toString()]);
    }

    /** @return list<{Entity}> */
    public function findAll(): array
    {
        return array_values($this->entities);
    }

    public function clear(): void
    {
        $this->entities = [];
    }
}

Generation Instructions

  1. Read the repository interface:

    • Extract all method signatures
    • Identify entity type
    • Identify ID type
  2. Generate InMemory implementation:

    • Array storage keyed by ID
    • Implement all interface methods
    • Add
      clear()
      for test cleanup
  3. Handle complex queries:

    • Use
      array_filter
      for criteria
    • Support specifications if used
    • Implement pagination with
      array_slice
  4. Add test helpers (optional):

    • getAll()
      — access internal state
    • has(Id $id)
      — check existence
    • count()
      — entity count
  5. File placement:

    • tests/Fake/InMemory{Entity}Repository.php
    • Or
      tests/Double/
      directory

Best Practices

  1. Match interface exactly — same method signatures
  2. Isolate per test — use
    clear()
    in tearDown
  3. Avoid complexity — simple in-memory logic
  4. Document deviations — if behavior differs from real impl
  5. Consider thread safety — for parallel tests (usually not needed)

References

  • references/examples.md
    — Complete repository examples (User, Order, Product)
  • references/other-fakes.md
    — EventDispatcher, Mailer, Clock fakes