68 lines
4.4 KiB
PHP
68 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Jobs\RunSimulation;
|
|
use App\Models\Simulation;
|
|
use App\Models\SimulationTaxRuleVersion;
|
|
use App\Models\User;
|
|
use App\Services\SimulationExecution;
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Queue;
|
|
use Illuminate\Support\Str;
|
|
use Tests\TestCase;
|
|
|
|
final class SimulatorClosureRecoveryTest extends TestCase
|
|
{
|
|
use DatabaseTransactions;
|
|
|
|
public function test_existing_monthly_admission_can_be_read_and_finished_when_new_admissions_are_off(): void
|
|
{
|
|
$identity = DB::selectOne('select current_database() as name,inet_server_port() as port');
|
|
$this->assertSame('simulator_fiscal_delta_20261021_test', $identity->name);
|
|
$this->assertSame(55441, (int) $identity->port);
|
|
Queue::fake();
|
|
// Reuse the existing isolated synthetic rule. No create/publish/suspend of any rule.
|
|
$rule = SimulationTaxRuleVersion::findOrFail('01a15e50-7972-72e0-8991-82ca28df9b49');
|
|
$before = $this->ruleFingerprint();
|
|
config(['simulation-fiscal-consumer.enabled' => true, 'simulation-fiscal-consumer.rule_id' => $rule->id, 'simulation-fiscal-consumer.rule_version' => $rule->rule_version]);
|
|
$actor = User::factory()->create(['email_verified_at' => now()]);
|
|
$input = ['scenario_kind' => 'fiscal_rule_published', 'currency' => 'MZN', 'scope_declared' => true, 'sales_vat_basis' => 'net', 'monthly_sales' => [['date' => '2026-01-01', 'amount' => '1000.03']]];
|
|
$id = $this->actingAs($actor)->postJson('/api/v1/simulations', $input, ['Idempotency-Key' => (string) Str::uuid()])->assertAccepted()->json('data.id');
|
|
$count = Simulation::count();
|
|
config(['simulation-fiscal-consumer.enabled' => false]);
|
|
$this->getJson('/api/v1/fiscal-consumer')->assertOk()->assertJsonPath('data.enabled', false);
|
|
$this->getJson('/api/v1/simulations/'.$id)->assertOk()->assertJsonPath('data.id', $id)->assertJsonPath('data.status', 'queued');
|
|
$this->postJson('/api/v1/simulations', $input, ['Idempotency-Key' => (string) Str::uuid()])->assertStatus(503);
|
|
(new RunSimulation($id, $actor->id, null))->handle(app(SimulationExecution::class));
|
|
$this->getJson('/api/v1/simulations/'.$id)->assertOk()->assertJsonPath('data.id', $id)->assertJsonPath('data.status', 'completed');
|
|
$this->assertSame($count, Simulation::count());
|
|
$this->actingAs(User::factory()->create(['email_verified_at' => now()]))->getJson('/api/v1/simulations/'.$id)->assertNotFound();
|
|
$this->assertSame($before, $this->ruleFingerprint());
|
|
}
|
|
|
|
private function ruleFingerprint(): string
|
|
{
|
|
return DB::selectOne("select md5(string_agg(row_to_json(r)::text,E'\\n' order by id)) as hash from simulation_tax_rule_versions r")->hash;
|
|
}
|
|
|
|
public function test_cashflow_original_currency_and_amounts_round_trip_in_the_existing_private_draft(): void
|
|
{
|
|
$identity = DB::selectOne('select current_database() as name,inet_server_port() as port');
|
|
$this->assertSame('simulator_fiscal_delta_20261021_test', $identity->name);
|
|
$this->assertSame(55441, (int) $identity->port);
|
|
config(['investor-path.enabled' => true, 'suitecrm.enabled' => false]);
|
|
$actor = User::factory()->create(['email_verified_at' => now()]);
|
|
$this->actingAs($actor);
|
|
$id = $this->postJson('/investimentos', ['title' => 'SYNTHETIC QA — moeda de tesouraria', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true])->assertCreated()->json('id');
|
|
$snapshot = json_encode(['version' => 2, 'currency' => 'USD', 'taxMode' => 'fixed', 'inputs' => ['monthlyRevenue' => '123', 'monthlyTaxSchedule' => ['0', '', '0']]], JSON_THROW_ON_ERROR);
|
|
$this->postJson('/api/v1/simulation-drafts', ['context' => $id, 'personal_snapshot' => [], 'economic_snapshot' => ['purpose' => 'simulate_only', 'project_title' => 'SYNTHETIC QA — moeda', 'currency' => 'MZN', 'cashflow_snapshot' => $snapshot]], ['Idempotency-Key' => (string) Str::uuid()])->assertCreated();
|
|
$this->actingAs($actor->fresh());
|
|
$saved = $this->getJson('/api/v1/simulation-drafts/current?context='.$id)->assertOk()->json('data.economic_snapshot');
|
|
$this->assertSame('MZN', $saved['currency']);
|
|
$this->assertSame($snapshot, $saved['cashflow_snapshot']);
|
|
$this->assertSame('USD', json_decode($saved['cashflow_snapshot'], true)['currency']);
|
|
}
|
|
}
|