123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- <?php
- namespace Tests\Feature\Api;
- use App\Alias;
- use App\EmailData;
- use App\Mail\ForwardEmail;
- use App\Rule;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Illuminate\Support\Str;
- use PhpMimeMailParser\Parser;
- use Tests\TestCase;
- class RulesTest extends TestCase
- {
- use RefreshDatabase;
- protected function setUp(): void
- {
- parent::setUp();
- parent::setUpPassport();
- $this->user->update(['username' => 'johndoe']);
- $this->user->recipients()->save($this->user->defaultRecipient);
- }
- /** @test */
- public function user_can_get_all_rules()
- {
- // Arrange
- factory(Rule::class, 3)->create([
- 'user_id' => $this->user->id
- ]);
- // At
- $response = $this->get('/api/v1/rules');
- // Assert
- $response->assertSuccessful();
- $this->assertCount(3, $response->json()['data']);
- }
- /** @test */
- public function user_can_get_individual_rule()
- {
- // Arrange
- $rule = factory(Rule::class)->create([
- 'user_id' => $this->user->id
- ]);
- // Act
- $response = $this->get('/api/v1/rules/'.$rule->id);
- // Assert
- $response->assertSuccessful();
- $this->assertCount(1, $response->json());
- $this->assertEquals($rule->name, $response->json()['data']['name']);
- }
- /** @test */
- public function user_can_create_new_rule()
- {
- $response = $this->json('POST', '/api/v1/rules', [
- 'name' => 'test rule',
- 'conditions' => [
- [
- 'type' => 'sender',
- 'match' => 'is exactly',
- 'values' => [
- 'Test Email'
- ]
- ],
- [
- 'type' => 'sender',
- 'match' => 'starts with',
- 'values' => [
- 'will'
- ]
- ],
- [
- 'type' => 'alias',
- 'match' => 'is exactly',
- 'values' => [
- 'ebay@johndoe.anonaddy.com'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'New Subject!'
- ],
- ],
- 'operator' => 'AND'
- ]);
- $response->assertStatus(201);
- $this->assertEquals('test rule', $response->getData()->data->name);
- }
- /** @test */
- public function user_cannot_create_invalid_rule()
- {
- $response = $this->json('POST', '/api/v1/rules', [
- 'name' => 'invalid rule',
- 'conditions' => [
- [
- 'type' => 'invalid',
- 'match' => 'is exactly',
- 'values' => [
- 'Test Email'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'New Subject!'
- ],
- ],
- 'operator' => 'AND'
- ]);
- $response->assertStatus(422);
- }
- /** @test */
- public function user_can_update_rule()
- {
- $rule = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'operator' => 'AND'
- ]);
- $response = $this->json('PATCH', '/api/v1/rules/'.$rule->id, [
- 'name' => 'new name',
- 'conditions' => [
- [
- 'type' => 'subject',
- 'match' => 'is exactly',
- 'values' => [
- 'Test Email'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'New Subject!'
- ],
- ],
- 'operator' => 'OR'
- ]);
- $response->assertStatus(200);
- $this->assertEquals('new name', $response->getData()->data->name);
- $this->assertEquals('OR', $response->getData()->data->operator);
- }
- /** @test */
- public function user_can_delete_rule()
- {
- $rule = factory(Rule::class)->create([
- 'user_id' => $this->user->id
- ]);
- $response = $this->json('DELETE', '/api/v1/rules/'.$rule->id);
- $response->assertStatus(204);
- $this->assertEmpty($this->user->rules);
- }
- /** @test */
- public function user_can_activate_rule()
- {
- $rule = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'active' => false
- ]);
- $response = $this->json('POST', '/api/v1/active-rules/', [
- 'id' => $rule->id
- ]);
- $response->assertStatus(200);
- $this->assertEquals(true, $response->getData()->data->active);
- }
- /** @test */
- public function user_can_deactivate_rule()
- {
- $rule = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'active' => true
- ]);
- $response = $this->json('DELETE', '/api/v1/active-rules/'.$rule->id);
- $response->assertStatus(204);
- $this->assertFalse($this->user->rules[0]->active);
- }
- /** @test */
- public function it_can_apply_user_rules()
- {
- factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'conditions' => [
- [
- 'type' => 'subject',
- 'match' => 'is exactly',
- 'values' => [
- 'Test Email'
- ]
- ],
- [
- 'type' => 'sender',
- 'match' => 'starts with',
- 'values' => [
- 'will'
- ]
- ],
- [
- 'type' => 'alias',
- 'match' => 'is exactly',
- 'values' => [
- 'ebay@johndoe.anonaddy.com'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'New Subject!'
- ],
- ],
- 'operator' => 'AND',
- ]);
- $alias = factory(Alias::class)->create([
- 'user_id' => $this->user->id,
- 'email' => 'ebay@johndoe.'.config('anonaddy.domain'),
- 'local_part' => 'ebay',
- 'domain' => 'johndoe.'.config('anonaddy.domain'),
- ]);
- $parser = $this->getParser(base_path('tests/emails/email.eml'));
- $size = 1500;
- $emailData = new EmailData($parser, $size);
- $job = new ForwardEmail($alias, $emailData, $this->user->defaultRecipient);
- $email = $job->build();
- $this->assertEquals('New Subject!', $email->subject);
- }
- /** @test */
- public function it_can_apply_user_rules_in_correct_order()
- {
- factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'conditions' => [
- [
- 'type' => 'alias',
- 'match' => 'is not',
- 'values' => [
- 'woot@johndoe.anonaddy.com'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'Applied after'
- ],
- ],
- 'operator' => 'AND',
- 'order' => 1
- ]);
- factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'conditions' => [
- [
- 'type' => 'subject',
- 'match' => 'is',
- 'values' => [
- 'Test Email'
- ]
- ],
- [
- 'type' => 'sender',
- 'match' => 'ends with',
- 'values' => [
- 'anonaddy.com'
- ]
- ],
- [
- 'type' => 'alias',
- 'match' => 'is',
- 'values' => [
- 'ebay@johndoe.anonaddy.com'
- ]
- ]
- ],
- 'actions' => [
- [
- 'type' => 'subject',
- 'value' => 'New Subject!'
- ],
- ],
- 'operator' => 'AND',
- ]);
- $alias = factory(Alias::class)->create([
- 'user_id' => $this->user->id,
- 'email' => 'ebay@johndoe.'.config('anonaddy.domain'),
- 'local_part' => 'ebay',
- 'domain' => 'johndoe.'.config('anonaddy.domain'),
- ]);
- $parser = $this->getParser(base_path('tests/emails/email.eml'));
- $size = 1000;
- $emailData = new EmailData($parser, $size);
- $job = new ForwardEmail($alias, $emailData, $this->user->defaultRecipient);
- $email = $job->build();
- $this->assertEquals('Applied after', $email->subject);
- }
- /** @test */
- public function user_can_reorder_rules()
- {
- $ruleOne = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'order' => 2
- ]);
- $ruleTwo = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'order' => 0
- ]);
- $ruleThree = factory(Rule::class)->create([
- 'user_id' => $this->user->id,
- 'order' => 1
- ]);
- $response = $this->json('POST', '/api/v1/reorder-rules/', [
- 'ids' => [
- $ruleOne->id,
- $ruleTwo->id,
- $ruleThree->id
- ]
- ]);
- $this->assertEquals(0, $ruleOne->refresh()->order);
- $this->assertEquals(1, $ruleTwo->refresh()->order);
- $this->assertEquals(2, $ruleThree->refresh()->order);
- $response->assertStatus(200);
- }
- protected function getParser($file)
- {
- $parser = new Parser;
- // Fix some edge cases in from name e.g. "\" John Doe \"" <johndoe@example.com>
- $parser->addMiddleware(function ($mimePart, $next) {
- $part = $mimePart->getPart();
- if (isset($part['headers']['from'])) {
- $value = $part['headers']['from'];
- $value = (is_array($value)) ? $value[0] : $value;
- try {
- $from = collect(mailparse_rfc822_parse_addresses($value));
- if ($from->count() > 1) {
- $part['headers']['from'] = $from->filter(function ($f) {
- return filter_var($f['address'], FILTER_VALIDATE_EMAIL);
- })->map(function ($f) {
- return $f['display'] . ' <' . $f['address'] . '>';
- })->first();
- $mimePart->setPart($part);
- }
- } catch (\Exception $e) {
- $part['headers']['from'] = str_replace("\\\"", "", $part['headers']['from']);
- $part['headers']['from'] = str_replace("\\", "", $part['headers']['from']);
- $mimePart->setPart($part);
- }
- }
- if (isset($part['headers']['reply-to'])) {
- $value = $part['headers']['reply-to'];
- $value = (is_array($value)) ? $value[0] : $value;
- try {
- mailparse_rfc822_parse_addresses($value);
- } catch (\Exception $e) {
- $part['headers']['reply-to'] = '<'.Str::afterLast($part['headers']['reply-to'], '<');
- $mimePart->setPart($part);
- }
- }
- return $next($mimePart);
- });
- if ($file == 'stream') {
- $fd = fopen('php://stdin', 'r');
- $this->rawEmail = '';
- while (!feof($fd)) {
- $this->rawEmail .= fread($fd, 1024);
- }
- fclose($fd);
- $parser->setText($this->rawEmail);
- } else {
- $parser->setPath($file);
- }
- return $parser;
- }
- }
|