ldc-crm/tests/CRM/ApiV2/SingleOptinTest.php
Alexis Gousseau 303834bbca
Crm V4
- Make all tests pass Client (V4),CRMV2,CRMV4
- Simplify client submodule path
- Move App_url to .env.testing
2023-10-06 16:37:29 +02:00

169 lines
5.6 KiB
PHP

<?php
namespace Tests\CRM\ApiV2;
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: apiV2.optin
*
* @return void
*/
public function testSetSingleOptinOn()
{
$service = Service::firstOrFail();
$response = $this->callApiWithToken($service, 'post', route('apiV2.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: apiV2.optin
*
* @return void
*/
public function testSetSingleOptinOff()
{
$service = Service::firstOrFail();
$response = $this->callApiWithToken($service, 'post', route('apiV2.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()
{
$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('apiV2.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: apiV2.optout-hashcode
*
* @return void
*/
public function testSetSingleOptoutWithHashcode()
{
$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('apiV2.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: apiV2.optout-hashcode
*
* @return void
*/
public function testSetSingleOptoutWithHashcodeFailsIfDoesNotExists()
{
$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('apiV2.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)
{
$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('apiV2.customers.store'), $data);
}
}