Skip to content

Commit ca8aff7

Browse files
committed
Add more import options
1 parent 6d3dcc0 commit ca8aff7

File tree

2 files changed

+135
-7
lines changed

2 files changed

+135
-7
lines changed

src/Subscription/Controller/SubscriberImportController.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ public function __construct(
6363
type: 'string',
6464
default: '0',
6565
enum: ['0', '1']
66+
),
67+
new OA\Property(
68+
property: 'skip_invalid_emails',
69+
description: 'Weather to skip invalid email or add with invalid_ prefix',
6670
)
6771
],
6872
type: 'object'
@@ -127,8 +131,12 @@ public function importSubscribers(Request $request): JsonResponse
127131

128132
try {
129133
$stats = $this->importManager->importFromCsv(
130-
$file,
131-
new SubscriberImportOptions($request->getPayload()->getBoolean('update_existing'))
134+
file: $file,
135+
options: new SubscriberImportOptions(
136+
updateExisting: $request->getPayload()->getBoolean('update_existing'),
137+
listIds: $request->getPayload()->get('list_id') ? [$request->getPayload()->get('list_id')] : [],
138+
skipInvalidEmail: $request->getPayload()->getBoolean('skip_invalid_emails', true)
139+
),
132140
);
133141

134142
return $this->json([

tests/Integration/Subscription/Controller/SubscriberImportControllerTest.php

Lines changed: 125 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function testImportSubscribersWithNonCsvFileReturnsBadRequestStatus(): vo
5151
{
5252
$filePath = $this->tempDir . '/test.txt';
5353
file_put_contents($filePath, 'This is not a CSV file');
54-
54+
5555
$file = new UploadedFile(
5656
$filePath,
5757
'test.txt',
@@ -77,7 +77,7 @@ public function testImportSubscribersWithValidCsvFile(): void
7777
$filePath = $this->tempDir . '/subscribers.csv';
7878
$csvContent = "email,name\n[email protected],Test User\n[email protected],Test User 2";
7979
file_put_contents($filePath, $csvContent);
80-
80+
8181
$file = new UploadedFile(
8282
$filePath,
8383
'subscribers.csv',
@@ -95,7 +95,7 @@ public function testImportSubscribersWithValidCsvFile(): void
9595

9696
$response = self::getClient()->getResponse();
9797
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
98-
98+
9999
$responseContent = $this->getDecodedJsonResponseContent();
100100
self::assertArrayHasKey('imported', $responseContent);
101101
self::assertArrayHasKey('skipped', $responseContent);
@@ -107,7 +107,7 @@ public function testImportSubscribersWithOptions(): void
107107
$filePath = $this->tempDir . '/subscribers.csv';
108108
$csvContent = "email,name\n[email protected],Test User";
109109
file_put_contents($filePath, $csvContent);
110-
110+
111111
$file = new UploadedFile(
112112
$filePath,
113113
'subscribers.csv',
@@ -128,7 +128,7 @@ public function testImportSubscribersWithOptions(): void
128128

129129
$response = self::getClient()->getResponse();
130130
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
131-
131+
132132
$responseContent = $this->getDecodedJsonResponseContent();
133133
self::assertArrayHasKey('imported', $responseContent);
134134
self::assertArrayHasKey('skipped', $responseContent);
@@ -141,4 +141,124 @@ public function testGetMethodIsNotAllowed(): void
141141

142142
$this->assertHttpMethodNotAllowed();
143143
}
144+
145+
public function testImportSubscribersWithListId(): void
146+
{
147+
$filePath = $this->tempDir . '/subscribers.csv';
148+
$csvContent = "email,name\n[email protected],Test User";
149+
file_put_contents($filePath, $csvContent);
150+
151+
$file = new UploadedFile(
152+
$filePath,
153+
'subscribers.csv',
154+
'text/csv',
155+
null,
156+
true
157+
);
158+
159+
$this->authenticatedJsonRequest(
160+
'POST',
161+
'/api/v2/subscribers/import',
162+
[
163+
'list_id' => '1'
164+
],
165+
['file' => $file]
166+
);
167+
168+
$response = self::getClient()->getResponse();
169+
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
170+
171+
$responseContent = $this->getDecodedJsonResponseContent();
172+
self::assertArrayHasKey('imported', $responseContent);
173+
self::assertArrayHasKey('skipped', $responseContent);
174+
self::assertArrayHasKey('errors', $responseContent);
175+
}
176+
177+
public function testImportSubscribersWithUpdateExisting(): void
178+
{
179+
$filePath = $this->tempDir . '/subscribers.csv';
180+
$csvContent = "email,name\n[email protected],Test User";
181+
file_put_contents($filePath, $csvContent);
182+
183+
$file = new UploadedFile(
184+
$filePath,
185+
'subscribers.csv',
186+
'text/csv',
187+
null,
188+
true
189+
);
190+
191+
$this->authenticatedJsonRequest(
192+
'POST',
193+
'/api/v2/subscribers/import',
194+
[
195+
'update_existing' => 'true'
196+
],
197+
['file' => $file]
198+
);
199+
200+
$response = self::getClient()->getResponse();
201+
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
202+
203+
$responseContent = $this->getDecodedJsonResponseContent();
204+
self::assertArrayHasKey('imported', $responseContent);
205+
self::assertArrayHasKey('skipped', $responseContent);
206+
self::assertArrayHasKey('errors', $responseContent);
207+
}
208+
209+
public function testImportSubscribersWithSkipInvalidEmails(): void
210+
{
211+
$filePath = $this->tempDir . '/subscribers.csv';
212+
$csvContent = "email,name\ninvalid-email,Test User";
213+
file_put_contents($filePath, $csvContent);
214+
215+
$file = new UploadedFile(
216+
$filePath,
217+
'subscribers.csv',
218+
'text/csv',
219+
null,
220+
true
221+
);
222+
223+
$this->authenticatedJsonRequest(
224+
'POST',
225+
'/api/v2/subscribers/import',
226+
[
227+
'skip_invalid_emails' => 'true'
228+
],
229+
['file' => $file]
230+
);
231+
232+
$response = self::getClient()->getResponse();
233+
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
234+
235+
$responseContent = $this->getDecodedJsonResponseContent();
236+
self::assertArrayHasKey('imported', $responseContent);
237+
self::assertArrayHasKey('skipped', $responseContent);
238+
self::assertArrayHasKey('errors', $responseContent);
239+
self::assertEquals(0, $responseContent['imported']);
240+
self::assertEquals(1, $responseContent['skipped']);
241+
self::assertEquals([], $responseContent['errors']);
242+
243+
$this->authenticatedJsonRequest(
244+
'POST',
245+
'/api/v2/subscribers/import',
246+
[
247+
'skip_invalid_emails' => 'false',
248+
'update_existing' => 'true'
249+
],
250+
['file' => $file],
251+
);
252+
253+
$response = self::getClient()->getResponse();
254+
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
255+
256+
$responseContent = $this->getDecodedJsonResponseContent();
257+
self::assertArrayHasKey('imported', $responseContent);
258+
self::assertArrayHasKey('skipped', $responseContent);
259+
self::assertArrayHasKey('errors', $responseContent);
260+
self::assertEquals(1, $responseContent['imported']);
261+
self::assertEquals(0, $responseContent['skipped']);
262+
self::assertEquals([], $responseContent['errors']);
263+
}
144264
}

0 commit comments

Comments
 (0)