124 lines
4.8 KiB
PHP
124 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\Mailman;
|
|
|
|
use App\Mailman\Data\MailingList;
|
|
use App\Mailman\Exceptions\MailmanServiceException;
|
|
use App\Mailman\Support\MailmanService;
|
|
use Generator;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Tests\RequestFactories\MailmanListRequestFactory;
|
|
use Tests\TestCase;
|
|
|
|
class ServiceTest extends TestCase
|
|
{
|
|
public function testItChecksForCredentials(): void
|
|
{
|
|
Http::fake([
|
|
'http://mailman.test/api/system/versions' => Http::response('', 200),
|
|
]);
|
|
|
|
$result = app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->check();
|
|
|
|
$this->assertTrue($result);
|
|
|
|
Http::assertSentCount(1);
|
|
Http::assertSent(fn ($request) => 'GET' === $request->method() && 'http://mailman.test/api/system/versions' === $request->url() && $request->header('Authorization') === ['Basic '.base64_encode('user:secret')]);
|
|
}
|
|
|
|
public function testItFailsWhenChckingCredentials(): void
|
|
{
|
|
Http::fake([
|
|
'http://mailman.test/api/system/versions' => Http::response('', 401),
|
|
]);
|
|
|
|
$result = app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->check();
|
|
|
|
$this->assertFalse($result);
|
|
|
|
Http::assertSentCount(1);
|
|
Http::assertSent(fn ($request) => 'GET' === $request->method() && 'http://mailman.test/api/system/versions' === $request->url() && $request->header('Authorization') === ['Basic '.base64_encode('user:secret')]);
|
|
}
|
|
|
|
public function testItGetsMembersFromList(): void
|
|
{
|
|
Http::fake([
|
|
'http://mailman.test/api/lists/listid/roster/member?page=1&count=10' => Http::response(json_encode([
|
|
'entries' => [
|
|
['email' => 'test@example.com'],
|
|
['email' => 'test2@example.com'],
|
|
],
|
|
'total_size' => 2,
|
|
]), 200),
|
|
]);
|
|
|
|
$result = app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->members('listid');
|
|
|
|
$this->assertEquals(['test@example.com', 'test2@example.com'], $result->toArray());
|
|
Http::assertSentCount(1);
|
|
Http::assertSent(fn ($request) => 'GET' === $request->method() && 'http://mailman.test/api/lists/listid/roster/member?page=1&count=10' === $request->url() && $request->header('Authorization') === ['Basic '.base64_encode('user:secret')]);
|
|
}
|
|
|
|
public function testItThrowsExceptionWhenLoginFailed(): void
|
|
{
|
|
$this->expectException(MailmanServiceException::class);
|
|
Http::fake([
|
|
'http://mailman.test/api/lists/listid/roster/member?page=1&count=10' => Http::response('', 401),
|
|
]);
|
|
|
|
app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->members('listid')->first();
|
|
}
|
|
|
|
public function testItCanGetLists(): void
|
|
{
|
|
Http::fake([
|
|
'http://mailman.test/api/lists?page=1&count=10' => Http::sequence()
|
|
->push(json_encode([
|
|
'entries' => [
|
|
MailmanListRequestFactory::new()->create(['display_name' => 'Eltern', 'fqdn_listname' => 'eltern@example.com']),
|
|
MailmanListRequestFactory::new()->create(['display_name' => 'Eltern2', 'fqdn_listname' => 'eltern2@example.com']),
|
|
],
|
|
'start' => 0,
|
|
'total_size' => 2,
|
|
]), 200),
|
|
]);
|
|
|
|
$lists = app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->getLists()->all();
|
|
$this->assertCount(2, $lists);
|
|
$this->assertInstanceOf(MailingList::class, $lists[0]);
|
|
$this->assertEquals('Eltern', $lists[0]->displayName);
|
|
}
|
|
|
|
public function listDataProvider(): Generator
|
|
{
|
|
foreach (range(3, 40) as $i) {
|
|
yield [
|
|
collect(range(1, $i))
|
|
->map(fn ($num) => ['email' => 'test'.$num.'@example.com'])
|
|
->toArray(),
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @dataProvider listDataProvider
|
|
*/
|
|
public function testItReturnsMoreThanOneResult(array $totals): void
|
|
{
|
|
$totals = collect($totals);
|
|
foreach ($totals->chunk(10) as $n => $chunk) {
|
|
Http::fake([
|
|
'http://mailman.test/api/lists/listid/roster/member?page='.($n + 1).'&count=10' => Http::response(json_encode([
|
|
'entries' => $chunk,
|
|
'total_size' => $totals->count(),
|
|
]), 200),
|
|
]);
|
|
}
|
|
|
|
$result = app(MailmanService::class)->setCredentials('http://mailman.test/api/', 'user', 'secret')->members('listid');
|
|
|
|
$this->assertCount($totals->count(), $result->toArray());
|
|
Http::assertSentCount($totals->chunk(10)->count());
|
|
}
|
|
}
|