SettingControllerTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace Tests\Api\v1\Controllers;
  3. use App\Models\User;
  4. use Tests\FeatureTestCase;
  5. use App\Facades\Settings;
  6. /**
  7. * @covers \App\Api\v1\Controllers\SettingController
  8. */
  9. class SettingControllerTest extends FeatureTestCase
  10. {
  11. /**
  12. * @var \App\Models\User
  13. */
  14. protected $user;
  15. private const SETTING_JSON_STRUCTURE = [
  16. 'key',
  17. 'value'
  18. ];
  19. private const TWOFAUTH_NATIVE_SETTING = 'showTokenAsDot';
  20. private const TWOFAUTH_NATIVE_SETTING_DEFAULT_VALUE = false;
  21. private const TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE = true;
  22. private const USER_DEFINED_SETTING = 'mySetting';
  23. private const USER_DEFINED_SETTING_VALUE = 'mySetting';
  24. private const USER_DEFINED_SETTING_CHANGED_VALUE = 'mySetting';
  25. /**
  26. * @test
  27. */
  28. public function setUp(): void
  29. {
  30. parent::setUp();
  31. $this->user = User::factory()->create();
  32. }
  33. /**
  34. * @test
  35. */
  36. public function test_index_returns_setting_collection()
  37. {
  38. $response = $this->actingAs($this->user, 'api-guard')
  39. ->json('GET', '/api/v1/settings')
  40. ->assertOk()
  41. ->assertJsonStructure([
  42. '*' => self::SETTING_JSON_STRUCTURE
  43. ]);
  44. }
  45. /**
  46. * @test
  47. */
  48. public function test_show_native_unchanged_setting_returns_consistent_value()
  49. {
  50. $response = $this->actingAs($this->user, 'api-guard')
  51. ->json('GET', '/api/v1/settings/' . self::TWOFAUTH_NATIVE_SETTING)
  52. ->assertOk()
  53. ->assertExactJson([
  54. 'key' => self::TWOFAUTH_NATIVE_SETTING,
  55. 'value' => self::TWOFAUTH_NATIVE_SETTING_DEFAULT_VALUE,
  56. ]);
  57. }
  58. /**
  59. * @test
  60. */
  61. public function test_show_native_changed_setting_returns_consistent_value()
  62. {
  63. Settings::set(self::TWOFAUTH_NATIVE_SETTING, self::TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE);
  64. $response = $this->actingAs($this->user, 'api-guard')
  65. ->json('GET', '/api/v1/settings/' . self::TWOFAUTH_NATIVE_SETTING)
  66. ->assertOk()
  67. ->assertExactJson([
  68. 'key' => self::TWOFAUTH_NATIVE_SETTING,
  69. 'value' => self::TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE,
  70. ]);
  71. }
  72. /**
  73. * @test
  74. */
  75. public function test_show_custom_user_setting_returns_consistent_value()
  76. {
  77. Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE);
  78. $response = $this->actingAs($this->user, 'api-guard')
  79. ->json('GET', '/api/v1/settings/' . self::USER_DEFINED_SETTING)
  80. ->assertOk()
  81. ->assertExactJson([
  82. 'key' => self::USER_DEFINED_SETTING,
  83. 'value' => self::USER_DEFINED_SETTING_VALUE,
  84. ]);
  85. }
  86. /**
  87. * @test
  88. */
  89. public function test_show_missing_setting_returns_not_found()
  90. {
  91. $response = $this->actingAs($this->user, 'api-guard')
  92. ->json('GET', '/api/v1/settings/missing')
  93. ->assertNotFound();
  94. }
  95. /**
  96. * @test
  97. */
  98. public function test_store_custom_user_setting_returns_success()
  99. {
  100. $response = $this->actingAs($this->user, 'api-guard')
  101. ->json('POST', '/api/v1/settings', [
  102. 'key' => self::USER_DEFINED_SETTING,
  103. 'value' => self::USER_DEFINED_SETTING_VALUE,
  104. ])
  105. ->assertCreated()
  106. ->assertExactJson([
  107. 'key' => self::USER_DEFINED_SETTING,
  108. 'value' => self::USER_DEFINED_SETTING_VALUE,
  109. ]);
  110. }
  111. /**
  112. * @test
  113. */
  114. public function test_store_invalid_custom_user_setting_returns_validation_error()
  115. {
  116. $response = $this->actingAs($this->user, 'api-guard')
  117. ->json('POST', '/api/v1/settings', [
  118. 'key' => null,
  119. 'value' => null,
  120. ])
  121. ->assertStatus(422);
  122. }
  123. /**
  124. * @test
  125. */
  126. public function test_store_existing_custom_user_setting_returns_validation_error()
  127. {
  128. Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE);
  129. $response = $this->actingAs($this->user, 'api-guard')
  130. ->json('POST', '/api/v1/settings', [
  131. 'key' => self::USER_DEFINED_SETTING,
  132. 'value' => self::USER_DEFINED_SETTING_VALUE,
  133. ])
  134. ->assertStatus(422);
  135. }
  136. /**
  137. * @test
  138. */
  139. public function test_update_unchanged_native_setting_returns_updated_setting()
  140. {
  141. $response = $this->actingAs($this->user, 'api-guard')
  142. ->json('PUT', '/api/v1/settings/' . self::TWOFAUTH_NATIVE_SETTING, [
  143. 'value' => self::TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE,
  144. ])
  145. ->assertOk()
  146. ->assertExactJson([
  147. 'key' => self::TWOFAUTH_NATIVE_SETTING,
  148. 'value' => self::TWOFAUTH_NATIVE_SETTING_CHANGED_VALUE,
  149. ]);
  150. }
  151. /**
  152. * @test
  153. */
  154. public function test_update_custom_user_setting_returns_updated_setting()
  155. {
  156. Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE);
  157. $response = $this->actingAs($this->user, 'api-guard')
  158. ->json('PUT', '/api/v1/settings/' . self::USER_DEFINED_SETTING, [
  159. 'value' => self::USER_DEFINED_SETTING_CHANGED_VALUE,
  160. ])
  161. ->assertOk()
  162. ->assertExactJson([
  163. 'key' => self::USER_DEFINED_SETTING,
  164. 'value' => self::USER_DEFINED_SETTING_CHANGED_VALUE,
  165. ]);
  166. }
  167. /**
  168. * @test
  169. */
  170. public function test_update_missing_user_setting_returns_created_setting()
  171. {
  172. $response = $this->actingAs($this->user, 'api-guard')
  173. ->json('PUT', '/api/v1/settings/' . self::USER_DEFINED_SETTING, [
  174. 'value' => self::USER_DEFINED_SETTING_CHANGED_VALUE,
  175. ])
  176. ->assertOk()
  177. ->assertExactJson([
  178. 'key' => self::USER_DEFINED_SETTING,
  179. 'value' => self::USER_DEFINED_SETTING_CHANGED_VALUE,
  180. ]);
  181. }
  182. /**
  183. * @test
  184. */
  185. public function test_destroy_user_setting_returns_success()
  186. {
  187. Settings::set(self::USER_DEFINED_SETTING, self::USER_DEFINED_SETTING_VALUE);
  188. $response = $this->actingAs($this->user, 'api-guard')
  189. ->json('DELETE', '/api/v1/settings/' . self::USER_DEFINED_SETTING)
  190. ->assertNoContent();
  191. }
  192. /**
  193. * @test
  194. */
  195. public function test_destroy_native_setting_returns_bad_request()
  196. {
  197. $response = $this->actingAs($this->user, 'api-guard')
  198. ->json('DELETE', '/api/v1/settings/' . self::TWOFAUTH_NATIVE_SETTING)
  199. ->assertStatus(400)
  200. ->assertJsonStructure([
  201. 'message',
  202. 'reason',
  203. ]);
  204. }
  205. /**
  206. * @test
  207. */
  208. public function test_destroy_missing_user_setting_returns_not_found()
  209. {
  210. $response = $this->actingAs($this->user, 'api-guard')
  211. ->json('DELETE', '/api/v1/settings/' . self::USER_DEFINED_SETTING)
  212. ->assertNotFound();
  213. }
  214. }