ldc-crm/tests/CRM/ApiV4/SingleOptinTest.php
2025-04-23 10:57:33 +02:00

169 lines
5.7 KiB
PHP

<?php
namespace Tests\CRM\ApiV4;
use App\Enums\ApiError;
use App\Enums\ApiStatus;
use App\Enums\Country;
use App\Models\Service;
use App\Models\SingleOptin;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\CreatesApplication;
class SingleOptinTest extends ApiBase
{
use CreatesApplication;
use DatabaseTransactions;
/**
* Test set single optin on.
* route: apiV4.optin
*
* @return void
*/
public function testSetSingleOptinOn(): void
{
$service = Service::firstOrFail();
$response = $this->callApiWithToken($service, 'post', route('apiV4.optin'), [
'email' => 'singleoptin@hotmail.fr',
'opt_in' => 1
]);
$json = $response->decodeResponseJson();
$this->assertApiResponseStatusIs($json, ApiStatus::OK);
$this->assertTrue(
SingleOptin::query()->where('email', 'singleoptin@hotmail.fr')->exists(),
'Single optin should have been set for email "singleoptin@hotmail.fr"'
);
}
/**
* Test set single optin off.
* route: apiV4.optin
*
* @return void
*/
public function testSetSingleOptinOff(): void
{
$service = Service::firstOrFail();
$response = $this->callApiWithToken($service, 'post', route('apiV4.optin'), [
'email' => 'singleoptin@hotmail.fr',
'opt_in' => 0
]);
$json = $response->decodeResponseJson();
$this->assertApiResponseStatusIs($json, ApiStatus::OK);
$this->assertFalse(
SingleOptin::query()->where('email', 'singleoptin@hotmail.fr')->exists(),
'Single optin should have been removed for email "singleoptin@hotmail.fr"'
);
}
/**
* Should throw an ApiError exception if trying to set
* optin to an email that already have an account.
*
* @return void
*/
public function testSingleOptinShouldFailIfCustomerExists(): void
{
$service = Service::firstOrFail();
$this->storeCustomer($service);
// * Make sure a single optin exists.
$singleOptin = SingleOptin::query()->where('email', 'singleoptin@hotmail.fr')->firstOrNew();
$singleOptin->brand()->associate($service->brand);
$singleOptin->email = 'singleoptin@hotmail.fr';
$singleOptin->saveOrFail();
$response = $this->callApiWithToken($service, 'post', route('apiV4.optin'), [
'email' => 'singleoptin@hotmail.fr',
'opt_in' => 1
]);
$json = $response->decodeResponseJson();
$this->assertApiResponseStatusIs($json, ApiStatus::KO);
$this->assertEquals(ApiError::singleOptinCustomerExists->value, $json->json('data.code'));
$this->assertEquals(ApiError::singleOptinCustomerExists->label(), $json->json('data.message'));
}
/**
* Test set single optin off using hashcode.
* route: apiV4.optout-hashcode
*
* @return void
*/
public function testSetSingleOptoutWithHashcode(): void
{
$service = Service::firstOrFail();
// * Make sure a single optin exists.
$singleOptin = SingleOptin::query()->where('email', 'singleoptout@hotmail.fr')->firstOrNew();
$singleOptin->brand()->associate($service->brand);
$singleOptin->email = 'singleoptout@hotmail.fr';
$singleOptin->saveOrFail();
$singleOptin->refresh();
$response = $this->callApiWithToken($service, 'post', route('apiV4.optout-hashcode'), [
'hashcode' => $singleOptin->hashcode
]);
$json = $response->decodeResponseJson();
$this->assertApiResponseStatusIs($json, ApiStatus::OK);
$this->assertFalse(
SingleOptin::query()->where('email', 'singleoptout@hotmail.fr')->exists(),
'Single optin should have been removed for email "singleoptout@hotmail.fr"'
);
}
/**
* Test set single optin off using hashcode fails if does not exists.
* route: apiV4.optout-hashcode
*
* @return void
*/
public function testSetSingleOptoutWithHashcodeFailsIfDoesNotExists(): void
{
$service = Service::firstOrFail();
// * Make sure a single optin exists.
$singleOptin = SingleOptin::query()->where('email', 'singleoptout@hotmail.fr')->firstOrNew();
$singleOptin->brand()->associate($service->brand);
$singleOptin->email = 'singleoptout@hotmail.fr';
$singleOptin->saveOrFail();
$singleOptin->refresh();
// * Make sure a single optin does exists.
$singleOptin->delete();
$response = $this->callApiWithToken($service, 'post', route('apiV4.optout-hashcode'), [
'hashcode' => $singleOptin->hashcode
]);
$json = $response->decodeResponseJson();
$this->assertApiResponseStatusIs($json, ApiStatus::KO);
$this->assertEquals(ApiError::modelNotFound->value, $json->json('data.code'));
}
/**
* Store a customer in DB.
*
* @param \App\Models\Service $service
* @return void
*/
private function storeCustomer(Service $service): void
{
$data = [
'firstname' => 'Jean',
'lastname' => 'Bond',
'birth_date' => \date('1992-03-08'),
'address' => '10 rue des totos',
'email' => 'singleoptin@hotmail.fr',
'password' => '123.Mot.De.P4sse',
'phone' => '+33654821562',
'country' => Country::france->value,
'city' => 'Connerré',
'postcode' => '72160',
'opt_in' => true
];
$this->callApiWithToken($service, 'post', route('apiV4.customers.store'), $data);
}
}