signin(); $response = $this->call('PROPFIND', '/dav/addressbooks'); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee('/dav/addressbooks/', false); $response->assertSee("/dav/addressbooks/{$user->email}/", false); } /** * @group dav */ public function test_carddav_propfind_addressbooks_user() { $user = $this->signin(); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}"); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee("/dav/addressbooks/{$user->email}/", false); $response->assertSee("/dav/addressbooks/{$user->email}/contacts/", false); } /** * @group dav */ public function test_carddav_propfind_contacts() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/contacts"); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee("/dav/addressbooks/{$user->email}/contacts/", false); $contactId = urlencode($contact->uuid); $response->assertSee("/dav/addressbooks/{$user->email}/contacts/{$contactId}.vcf", false); } public function test_carddav_propfind_contacts_with_props() { $user = $this->signin(); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/contacts/", [], [], [], [ 'HTTP_DEPTH' => 0, ], ' ' ); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee(''. ''. "/dav/addressbooks/{$user->email}/contacts/". ''. ''. 'Contacts'. ''. 'HTTP/1.1 200 OK'. ''. ''. 'signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf"); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee("/dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf", false); } /** * @group dav */ public function test_carddav_propfind_one_contact_without_extension() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/contacts/{$contact->uuid}"); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee("/dav/addressbooks/{$user->email}/contacts/{$contact->uuid}", false); } public function test_carddav_getctag() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/", [], [], [], [ 'HTTP_DEPTH' => '1', 'content-type' => 'application/xml; charset=utf-8', ], " " ); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $tokens = SyncToken::where([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', ])->orderBy('created_at')->get(); $this->assertGreaterThan(0, $tokens->count()); $token = $tokens->last(); $response->assertSee('', false); $response->assertSee(''. "/dav/addressbooks/{$user->email}/contacts/". ''. ''. "http://sabre.io/ns/sync/{$token->id}". "http://sabre.io/ns/sync/{$token->id}". ''. 'HTTP/1.1 200 OK'. ''. '', false); } public function test_carddav_get_me_card() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $user->me_contact_id = $contact->id; $user->save(); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}", [], [], [], [ 'HTTP_DEPTH' => '1', 'content-type' => 'application/xml; charset=utf-8', ], " " ); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $response->assertSee(''. "/dav/addressbooks/{$user->email}/contacts/". ''. ''. "/dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf". ''. 'HTTP/1.1 200 OK'. ''. '', false); } public function test_carddav_set_me_card() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPPATCH', "/dav/addressbooks/{$user->email}/contacts", [], [], [], [ 'content-type' => 'application/xml; charset=utf-8', ], " /dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf " ); $response->assertSee('', false); $response->assertSee(''. "/dav/addressbooks/{$user->email}/contacts". ''. ''. ''. ''. 'HTTP/1.1 200 OK'. ''. '', false); $this->assertDatabaseHas('users', [ 'id' => $user->id, 'me_contact_id' => $contact->id, ]); } public function test_carddav_getctag_contacts() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('PROPFIND', "/dav/addressbooks/{$user->email}/contacts/", [], [], [], [ 'HTTP_DEPTH' => '0', 'content-type' => 'application/xml; charset=utf-8', ], " " ); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $tokens = SyncToken::where([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', ])->orderBy('created_at')->get(); $this->assertGreaterThan(0, $tokens->count()); $token = $tokens->last(); $response->assertSee('', false); $response->assertSee(''. "/dav/addressbooks/{$user->email}/contacts/". ''. ''. "http://sabre.io/ns/sync/{$token->id}". "http://sabre.io/ns/sync/{$token->id}". ''. 'HTTP/1.1 200 OK'. ''. '', false); } public function test_carddav_sync_collection_with_token() { Carbon::setTestNow(Carbon::create(2019, 1, 1, 9, 0, 0)); $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); Carbon::setTestNow(Carbon::create(2018, 1, 1, 8, 0, 0)); $token = factory(SyncToken::class)->create([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', 'timestamp' => now(), ]); $response = $this->call('REPORT', "/dav/addressbooks/{$user->email}/contacts/", [], [], [], [ 'content-type' => 'application/xml; charset=utf-8', ], " http://sabre.io/ns/sync/{$token->id} 1 " ); $response->assertStatus(207); $token = SyncToken::where([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', ]) ->orderBy('created_at') ->get() ->last(); $response->assertSee(" /dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf "{$this->getEtag($contact)}" HTTP/1.1 200 OK http://sabre.io/ns/sync/{$token->id} ", false); } public function test_carddav_sync_collection_init() { $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, ]); $response = $this->call('REPORT', "/dav/addressbooks/{$user->email}/contacts/", [], [], [], [ 'content-type' => 'application/xml; charset=utf-8', ], " 1 " ); $response->assertStatus(207); $response->assertHeader('X-Sabre-Version'); $tokens = SyncToken::where([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', ])->orderBy('created_at')->get(); $this->assertGreaterThan(0, $tokens->count()); $token = $tokens->last(); $response->assertSee(" /dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf "{$this->getEtag($contact)}" HTTP/1.1 200 OK http://sabre.io/ns/sync/{$token->id} ", false); } public function test_carddav_sync_collection_deleted_contact() { Carbon::setTestNow(Carbon::create(2019, 1, 1, 9, 0, 0)); $user = $this->signin(); $contact = factory(Contact::class)->create([ 'account_id' => $user->account_id, 'deleted_at' => Carbon::create(2019, 3, 1, 9, 0, 0), ]); Carbon::setTestNow(Carbon::create(2019, 2, 1, 9, 0, 0)); $token = factory(SyncToken::class)->create([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', 'timestamp' => now(), ]); Carbon::setTestNow(Carbon::create(2019, 4, 1, 9, 0, 0)); $response = $this->call('REPORT', "/dav/addressbooks/{$user->email}/contacts/", [], [], [], [ 'content-type' => 'application/xml; charset=utf-8', ], " http://sabre.io/ns/sync/{$token->id} 1 " ); $response->assertStatus(207); $token = SyncToken::where([ 'account_id' => $user->account_id, 'user_id' => $user->id, 'name' => 'contacts', ]) ->orderBy('created_at') ->get() ->last(); $response->assertSee(" /dav/addressbooks/{$user->email}/contacts/{$contact->uuid}.vcf HTTP/1.1 404 Not Found http://sabre.io/ns/sync/{$token->id} ", false); } }