. */ namespace Tests\Feature; use App\Account; use App\Admin; use App\StatisticsCallDevice; use App\StatisticsMessageDevice; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class ApiStatisticsTest extends TestCase { use WithFaker, RefreshDatabase; protected $routeMessages = '/api/statistics/messages'; protected $routeCalls = '/api/statistics/calls'; public function testMessages() { $admin = Admin::factory()->create(); $admin->account->generateApiKey(); $id = '1234'; $fromUsername = 'username'; $fromDomain = 'domain.com'; $account = Account::factory()->create([ 'username' => $fromUsername, 'domain' => $fromDomain, ]); $this->keyAuthenticated($admin->account) ->json('POST', $this->routeMessages, [ 'id' => $id, 'from' => $fromUsername . '@' . $fromDomain, 'sent_at' => $this->faker->iso8601(), 'encrypted' => false ]) ->assertStatus(200); $this->assertDatabaseHas('statistics_messages', [ 'id' => $id ]); $this->keyAuthenticated($admin->account) ->json('POST', $this->routeMessages, [ 'id' => $id, 'from' => $this->faker->email(), 'sent_at' => $this->faker->iso8601(), 'encrypted' => false ]) ->assertStatus(400); $this->keyAuthenticated($admin->account) ->json('POST', $this->routeMessages, [ 'id' => $id, 'from' => $this->faker->email(), 'sent_at' => 'bad_date', 'encrypted' => false ]) ->assertJsonValidationErrors(['sent_at']); // Patch previous message with devices $to = $this->faker->email(); $device = $this->faker->uuid(); $receivedAt = $this->faker->iso8601(); $lastStatus = 200; $newReceivedAt = $this->faker->iso8601(); $newLastStatus = 201; $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeMessages . '/' . $id . '/to/' . $to . ' /devices/' . $device, [ 'last_status' => $lastStatus, 'received_at' => $receivedAt ]) ->assertStatus(201); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeMessages . '/' . $id . '/to/' . $to . ' /devices/' . $device, [ 'last_status' => $newLastStatus, 'received_at' => $newReceivedAt ]) ->assertStatus(200); $this->assertSame(1, StatisticsMessageDevice::count()); $this->assertDatabaseHas('statistics_message_devices', [ 'message_id' => $id, 'last_status' => $newLastStatus ]); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeMessages . '/' . $id . '/to/' . $this->faker->email() . ' /devices/' . $this->faker->uuid(), [ 'last_status' => $newLastStatus, 'received_at' => $newReceivedAt ]) ->assertStatus(201); $this->assertSame(2, StatisticsMessageDevice::count()); // Deletion event test $account->delete(); $this->assertDatabaseMissing('statistics_messages', [ 'id' => $id ]); } public function testCalls() { $admin = Admin::factory()->create(); $admin->account->generateApiKey(); $id = '1234'; $fromUsername = 'username'; $fromDomain = 'domain.com'; $toUsername = 'usernameto'; $toDomain = 'domainto.com'; $account = Account::factory()->create([ 'username' => $fromUsername, 'domain' => $fromDomain, ]); $this->keyAuthenticated($admin->account) ->json('POST', $this->routeCalls, [ 'id' => $id, 'from' => $fromUsername . '@' . $fromDomain, 'to' => $toUsername . '@' . $toDomain, 'initiated_at' => $this->faker->iso8601(), ]) ->assertStatus(200); $this->assertDatabaseHas('statistics_calls', [ 'id' => $id ]); $this->keyAuthenticated($admin->account) ->json('POST', $this->routeCalls, [ 'id' => $id, 'from' => $fromUsername . '@' . $fromDomain, 'to' => $toUsername . '@' . $toDomain, 'initiated_at' => $this->faker->iso8601(), ]) ->assertStatus(400); // Patch previous call with devices* $to = $this->faker->email(); $device = $this->faker->uuid(); $rangAt = $this->faker->iso8601(); $newRangAt = $this->faker->iso8601(); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeCalls . '/' . $id . '/devices/' . $device, [ 'rang_at' => $rangAt, 'invite_terminated' => [ 'at' => $this->faker->iso8601(), 'state' => 'declined' ] ]) ->assertStatus(201); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeCalls . '/' . $id . '/devices/' . $device, [ 'rang_at' => $newRangAt, 'invite_terminated' => [ 'at' => $this->faker->iso8601(), 'state' => 'declined' ] ]) ->assertStatus(200); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeCalls . '/' . $id . '/devices/' . $device, [ 'invite_terminated' => [ 'state' => 'declined' ] ]) ->assertStatus(422); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeCalls . '/' . $id . '/devices/' . $device, [ 'rang_at' => $this->faker->iso8601() ]) ->assertStatus(200); $this->assertSame(1, StatisticsCallDevice::count()); // Update $endedAt = $this->faker->iso8601(); $this->keyAuthenticated($admin->account) ->json('PATCH', $this->routeCalls . '/' . $id, [ 'ended_at' => $endedAt ]) ->assertStatus(200); // Deletion event test $account->delete(); $this->assertDatabaseMissing('statistics_calls', [ 'id' => $id ]); } }