create(['email' => 'firma@example.test']); $viaContact = User::factory()->create(['email' => 'kontakt@example.test']); $orphan = User::factory()->create(['email' => 'niemand@example.test']); $companyA = Company::factory()->presseecho()->create(['email' => 'firma@example.test', 'name' => 'Erklärbar AG']); $companyB = Company::factory()->presseecho()->create(['email' => 'andere@example.test', 'name' => 'Kontakt GmbH']); Contact::factory()->for($companyB)->create(['email' => 'Kontakt@Example.test', 'portal' => $companyB->portal->value]); $companyC = Company::factory()->presseecho()->create(['email' => 'dritte@example.test', 'name' => 'Verwaist KG']); $viaCompany->companies()->attach($companyA->id, ['role' => 'responsible']); $viaContact->companies()->attach($companyB->id, ['role' => 'responsible']); $orphan->companies()->attach($companyC->id, ['role' => 'responsible']); $orphan->companies()->attach($companyA->id, ['role' => 'owner']); $this->artisan('company-memberships:audit', ['--since' => '2000-01-01']) ->expectsOutputToContain('Verwaist KG') ->doesntExpectOutputToContain('Erklärbar AG') ->doesntExpectOutputToContain('Kontakt GmbH') ->assertSuccessful(); // Ohne --classify bleibt alles manual. expect(DB::table('company_user')->where('granted_via', 'auto')->count())->toBe(0); $this->artisan('company-memberships:audit', ['--classify' => true, '--since' => '2000-01-01'])->assertSuccessful(); $via = fn (int $userId, int $companyId): string => DB::table('company_user')->where('user_id', $userId)->where('company_id', $companyId)->value('granted_via'); expect($via($viaCompany->id, $companyA->id))->toBe('auto') ->and($via($viaContact->id, $companyB->id))->toBe('auto') ->and($via($orphan->id, $companyC->id))->toBe('manual') ->and($via($orphan->id, $companyA->id))->toBe('manual'); expect(collect(Storage::disk('local')->files())->filter(fn (string $f) => str_starts_with($f, 'company-memberships-unexplained-')))->toHaveCount(1); });