La License API le pide a Statamic que emita licencias y le da otra forma a la respuesta. A tus tests no se les permite hacer esa llamada de verdad. No porque sea lenta, sino porque una suite de tests que depende de que un tercero esté en pie es una apuesta.
Http::fake() reemplaza la red y nada más. Todo lo que hay entre la ruta y el driver se ejecuta de verdad:
it('returns the created license', function () {
actingAsConsumer('licenses:write');
Http::fake(['*/sites*' => Http::sequence()
->push(['data' => []])
->push(['data' => [
'key' => 'lic_1',
'name' => 'Acme',
'created_at' => '2026-01-29T12:00:00Z',
]], 201),
]);
$this->postJson('/api/licenses', [
'name' => 'Acme',
'domain' => 'acme.test',
])
->assertCreated()
->assertJsonPath('data.key', 'lic_1');
});
La secuencia es el lado del proveedor en la conversación tal como la dejó el Capítulo 8: primero la lista, que está vacía, y después la creación. Ese es el lugar correcto para cortar, lo más afuera posible.
Simular es además la única manera de poner a un proveedor en un estado de fallo concreto cuando tú quieres, cosa que no puedes hacerle a una dependencia real que resulta estar sana.
Factories que describen una intención
Una factory es la documentación de cómo es un registro válido, escrita como código.
// database/factories/ConsumerFactory.php
public function definition(): array
{
return [
'name' => fake()->unique()->company(),
'settings' => [],
'rate_limit' => null,
'license_limit' => 50,
];
}
public function forPartner(string $token): static
{
return $this->state(fn () => [
'settings' => ['statamic_token' => $token],
]);
}
definition() es la línea base: el consumidor que quieres en un test que no trata de consumidores. El método de estado es donde una factory se gana la palabra «intención». Consumer::factory()->forPartner('tok')->create() se lee como una frase. Construir el mismo registro a mano obliga a cada autor de un test a deducir otra vez qué significa «un consumidor de un socio», y cuando el modelo gana una columna obligatoria, todas esas llamadas a mano se rompen a la vez donde una factory habría absorbido el cambio.
license_limit está escrito de forma explícita aunque la columna tiene un valor por defecto. Un modelo recién salido de una factory solo conoce los atributos que se le dieron, y un límite que se lee como null rechazaría todas las creaciones.
El consumidor base no tiene token de proveedor. Un test que llega al proveedor sin decir de quién son las credenciales que usa recibe la excepción que prometió el Capítulo 4, y ese es el comportamiento con el que quieres que tropiece un test.