AddressUnitTest.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. namespace Tests\Unit\Address;
  3. use App\Shop\Addresses\Address;
  4. use App\Shop\Addresses\Exceptions\CreateAddressErrorException;
  5. use App\Shop\Addresses\Exceptions\AddressNotFoundException;
  6. use App\Shop\Addresses\Repositories\AddressRepository;
  7. use App\Shop\Addresses\Transformations\AddressTransformable;
  8. use App\Shop\Cities\Repositories\CityRepository;
  9. use App\Shop\Customers\Customer;
  10. use App\Shop\Customers\Repositories\CustomerRepository;
  11. use App\Shop\Orders\Order;
  12. use App\Shop\Provinces\Province;
  13. use App\Shop\Cities\City;
  14. use App\Shop\Countries\Country;
  15. use Tests\TestCase;
  16. class AddressUnitTest extends TestCase
  17. {
  18. use AddressTransformable;
  19. /** @test */
  20. public function it_shows_the_orders_for_this_address()
  21. {
  22. $address = factory(Address::class)->create();
  23. factory(Order::class)->create([
  24. 'address_id' => $address->id
  25. ]);
  26. $repo = new AddressRepository($address);
  27. $orders = $repo->findOrders();
  28. $orders->each(function ($item) use ($address) {
  29. $this->assertEquals($address->id, $item->address_id);
  30. });
  31. }
  32. /** @test */
  33. public function it_returns_the_country_of_the_address()
  34. {
  35. $country = factory(Country::class)->create();
  36. $province = factory(Province::class)->create();
  37. $city = factory(City::class)->create();
  38. $address = factory(Address::class)->create([
  39. 'country_id' => $country->id,
  40. 'province_id' => $province->id,
  41. 'city' => $city->name
  42. ]);
  43. $repo = new AddressRepository($address);
  44. $foundCountry = $repo->findCountry();
  45. $foundProvince = $repo->findProvince();
  46. $cityRepo = new CityRepository($city);
  47. $foundCity = $cityRepo->findCityByName($address->city);
  48. $this->assertInstanceOf(Country::class, $foundCountry);
  49. $this->assertInstanceOf(Province::class, $foundProvince);
  50. $this->assertInstanceOf(City::class, $foundCity);
  51. $this->assertEquals($country->name, $foundCountry->name);
  52. $this->assertEquals($province->name, $foundProvince->name);
  53. $this->assertEquals($city->name, $foundCity->name);
  54. }
  55. /** @test */
  56. public function it_can_transform_address()
  57. {
  58. $city = factory(City::class)->create();
  59. $province = factory(Province::class)->create();
  60. $country = factory(Country::class)->create();
  61. $customer = factory(Customer::class)->create();
  62. $address = factory(Address::class)->create([
  63. 'city' => $city->name,
  64. 'province_id' => $province->id,
  65. 'country_id' => $country->id,
  66. 'customer_id' => $customer->id,
  67. ]);
  68. $transformed = $this->transformAddress($address);
  69. $this->assertEquals($city->name, $transformed->city);
  70. $this->assertEquals($province->name, $transformed->province);
  71. $this->assertEquals($country->name, $transformed->country);
  72. $this->assertEquals($customer->name, $transformed->customer);
  73. }
  74. /** @test */
  75. public function it_can_search_the_address()
  76. {
  77. $address1 = $this->faker->address;
  78. $address = factory(Address::class)->create([
  79. 'address_1' => $address1
  80. ]);
  81. $repo = new AddressRepository(new Address());
  82. $results = $repo->searchAddress(str_limit($address->address_1, 5, ''));
  83. $this->assertTrue((bool) $results->count());
  84. }
  85. /** @test */
  86. public function it_can_return_the_owner_of_the_address()
  87. {
  88. $customer = factory(Customer::class)->create();
  89. $address = factory(Address::class)->create(['customer_id' => $customer->id]);
  90. $addressRepo = new AddressRepository($address);
  91. $found = $addressRepo->findCustomer();
  92. $this->assertEquals($customer->name, $found->name);
  93. }
  94. /** @test */
  95. public function it_can_be_attached_to_a_customer()
  96. {
  97. $customer = factory(Customer::class)->create();
  98. $address = factory(Address::class)->create();
  99. $addressRepo = new AddressRepository($address);
  100. $addressRepo->attachToCustomer($address, $customer);
  101. $this->assertEquals($customer->name, $address->customer->name);
  102. }
  103. /** @test */
  104. public function it_errors_when_the_address_is_not_found()
  105. {
  106. $this->expectException(AddressNotFoundException::class);
  107. $address = new AddressRepository(new Address);
  108. $address->findAddressById(999);
  109. }
  110. /** @test */
  111. public function it_can_list_all_the_addresses()
  112. {
  113. $address = factory(Address::class)->create();
  114. $address = new AddressRepository($address);
  115. $addresses = $address->listAddress();
  116. foreach ($addresses as $list) {
  117. $this->assertDatabaseHas('addresses', ['alias' => $list->alias]);
  118. }
  119. }
  120. /** @test */
  121. public function it_errors_when_creating_an_address()
  122. {
  123. $this->expectException(CreateAddressErrorException::class);
  124. $address = new AddressRepository(new Address);
  125. $address->createAddress([]);
  126. }
  127. /** @test */
  128. public function it_can_show_the_address()
  129. {
  130. $address = factory(Address::class)->create();
  131. $this->assertDatabaseHas('addresses', ['id' => $address->id]);
  132. }
  133. /** @test */
  134. public function it_can_list_all_the_addresses_of_the_customer()
  135. {
  136. $customer = factory(Customer::class)->create();
  137. factory(Address::class)->create(['customer_id' => $customer->id]);
  138. $customerRepo = new CustomerRepository($customer);
  139. $lists = $customerRepo->findAddresses();
  140. $this->assertCount(1, $lists);
  141. }
  142. /** @test */
  143. public function it_can_soft_delete_the_address()
  144. {
  145. $created = factory(Address::class)->create();
  146. $address = new AddressRepository($created);
  147. $address->deleteAddress();
  148. $this->assertDatabaseHas('addresses', ['id' => $created->id]);
  149. }
  150. /** @test */
  151. public function it_can_update_the_address()
  152. {
  153. $address = factory(Address::class)->create();
  154. $data = [
  155. 'alias' => $this->faker->unique()->word,
  156. 'address_1' => $this->faker->unique()->word,
  157. 'address_2' => null,
  158. 'zip' => 1101,
  159. 'status' => 1
  160. ];
  161. $addressRepo = new AddressRepository($address);
  162. $updated = $addressRepo->updateAddress($data);
  163. $address = $addressRepo->findAddressById($address->id);
  164. $this->assertTrue($updated);
  165. $this->assertEquals($data['alias'], $address->alias);
  166. $this->assertEquals($data['address_1'], $address->address_1);
  167. $this->assertEquals($data['address_2'], $address->address_2);
  168. $this->assertEquals($data['zip'], $address->zip);
  169. $this->assertEquals($data['status'], $address->status);
  170. }
  171. /** @test */
  172. public function it_can_create_the_address()
  173. {
  174. $country = factory(Country::class)->create();
  175. $province = factory(Province::class)->create();
  176. $city = factory(City::class)->create();
  177. $customer = factory(Customer::class)->create();
  178. $data = [
  179. 'alias' => 'home',
  180. 'address_1' => $this->faker->streetName,
  181. 'address_2' => $this->faker->streetAddress,
  182. 'zip' => $this->faker->postcode,
  183. 'city' => $city->name,
  184. 'province_id' => $province->id,
  185. 'country_id' => $country->id,
  186. 'customer_id' => $customer->id,
  187. 'status' => 1
  188. ];
  189. $addressRepo = new AddressRepository(new Address);
  190. $address = $addressRepo->createAddress($data);
  191. $this->assertInstanceOf(Address::class, $address);
  192. $this->assertEquals($data['alias'], $address->alias);
  193. $this->assertEquals($data['address_1'], $address->address_1);
  194. $this->assertEquals($data['address_2'], $address->address_2);
  195. $this->assertEquals($data['zip'], $address->zip);
  196. $this->assertEquals($data['status'], $address->status);
  197. }
  198. }