puerto 0.15.0

Puerto — Rust full-stack DDD framework CLI. Scaffolds Clean Architecture projects with auto-wired DI, SQLx support, and zero manual wiring. Formerly puerto-framework.
import { describe, expect, test } from "bun:test";
import { fireEvent, screen } from "@testing-library/react";
import { {{ pascal }}Error } from "../../../../domain/{{ kebab }}/errors";
import { fake{{ pascal }}Repository, {{ pascal }}Mother } from "../../../../test-support/{{ kebab }}";
import { renderScreen } from "../../../../test-support/render";
import { {{ pascal }}ListContainer } from "./{{ kebab }}-list-container";

describe("{{ pascal }}ListContainer", () => {
  test("should show a row per {{ words }} when there are some", async () => {
    // Arrange
    const seed = [{{ pascal }}Mother.random(), {{ pascal }}Mother.random()];
    const {{ camel }}Repository = fake{{ pascal }}Repository(seed);

    // Act
    renderScreen(<{{ pascal }}ListContainer />, { {{ camel }}Repository });

    // Assert
    expect(await screen.findAllByText("View")).toHaveLength(2);
  });

  test("should show the next page when Next is pressed", async () => {
    // Arrange
    const seed = Array.from({ length: 25 }, () => {{ pascal }}Mother.random());
    const {{ camel }}Repository = fake{{ pascal }}Repository(seed);
    renderScreen(<{{ pascal }}ListContainer />, { {{ camel }}Repository });
    expect(await screen.findAllByText("View")).toHaveLength(20);

    // Act
    fireEvent.click(screen.getByRole("button", { name: "Next" }));

    // Assert
    expect(await screen.findByText("21–25 of 25")).toBeTruthy();
    expect(screen.getAllByText("View")).toHaveLength(5);
  });

  test("should say so when there is no {{ words }}", async () => {
    // Arrange
    const {{ camel }}Repository = fake{{ pascal }}Repository();

    // Act
    renderScreen(<{{ pascal }}ListContainer />, { {{ camel }}Repository });

    // Assert
    expect(await screen.findByText("No {{ words_plural }} yet.")).toBeTruthy();
  });

  test("should show the error code when the {{ words_plural }} cannot be listed", async () => {
    // Arrange
    const {{ camel }}Repository = {
      ...fake{{ pascal }}Repository(),
      list: () => Promise.reject(new {{ pascal }}Error("{{ snake }}.repository_error")),
    };

    // Act
    renderScreen(<{{ pascal }}ListContainer />, { {{ camel }}Repository });

    // Assert
    expect((await screen.findByRole("alert")).textContent).toBe("{{ snake }}.repository_error");
  });
});