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() { $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() { $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() { $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() { $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) { $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); } }