url(); if (str_contains($url, 'search-by-email')) { return Http::response(['status' => 'error']); } if ($request->method() === 'POST' && preg_match('#/lists/[^/]+/subscribers$#', $url) === 1) { return Http::response(['status' => 'success']); } return Http::response(['status' => 'error'], 500); }); $page = $this->makePageWithMailwizz(); $this->postJson(route('public.subscribe', ['publicPage' => $page->slug]), [ 'first_name' => 'Ada', 'last_name' => 'Lovelace', 'email' => 'ada@example.com', ])->assertOk(); $subscriber = Subscriber::query()->where('email', 'ada@example.com')->first(); $this->assertNotNull($subscriber); $this->assertTrue($subscriber->synced_to_mailwizz); $this->assertNotNull($subscriber->synced_at); } public function test_subscribe_with_mailwizz_config_runs_sync_update_path_with_tag_merge(): void { Http::fake(function (Request $request) { $url = $request->url(); if (str_contains($url, 'search-by-email')) { return Http::response(['status' => 'success', 'data' => ['subscriber_uid' => 'sub-uid-1']]); } if ($request->method() === 'GET' && str_contains($url, '/subscribers/sub-uid-1') && ! str_contains($url, 'search-by-email')) { return Http::response([ 'status' => 'success', 'data' => [ 'record' => [ 'TAGS' => 'existing-one', ], ], ]); } if ($request->method() === 'PUT' && str_contains($url, '/subscribers/sub-uid-1')) { $body = $request->body(); $this->assertStringContainsString('TAGS', $body); $this->assertStringContainsString('existing-one', $body); $this->assertStringContainsString('new-source-tag', $body); return Http::response(['status' => 'success']); } return Http::response(['status' => 'error'], 500); }); $page = $this->makePageWithMailwizz([ 'tag_field' => 'TAGS', 'tag_value' => 'new-source-tag', ]); $this->postJson(route('public.subscribe', ['publicPage' => $page->slug]), [ 'first_name' => 'Grace', 'last_name' => 'Hopper', 'email' => 'grace@example.com', ])->assertOk(); $subscriber = Subscriber::query()->where('email', 'grace@example.com')->first(); $this->assertNotNull($subscriber); $this->assertTrue($subscriber->synced_to_mailwizz); } /** * @param array $configOverrides */ private function makePageWithMailwizz(array $configOverrides = []): PreregistrationPage { $user = User::factory()->create(['role' => 'user']); $page = PreregistrationPage::query()->create([ 'slug' => (string) Str::uuid(), 'user_id' => $user->id, 'title' => 'Fest', 'heading' => 'Join', 'intro_text' => null, 'thank_you_message' => null, 'expired_message' => null, 'ticketshop_url' => null, 'start_date' => now()->subHour(), 'end_date' => now()->addMonth(), 'phone_enabled' => false, 'is_active' => true, ]); MailwizzConfig::query()->create(array_merge([ 'preregistration_page_id' => $page->id, 'api_key' => 'fake-api-key', 'list_uid' => 'list-uid-1', 'list_name' => 'Main list', 'field_email' => 'EMAIL', 'field_first_name' => 'FNAME', 'field_last_name' => 'LNAME', 'field_phone' => null, 'tag_field' => 'TAGS', 'tag_value' => 'preregister-source', ], $configOverrides)); return $page->fresh(['mailwizzConfig']); } }