ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
4.8 KiB

  1. require 'rails_helper'
  2. RSpec.describe 'Deerjikists API', type: :request do
  3. let(:platform) { 'nico' }
  4. let(:code) { 'deerjika-bot' }
  5. let!(:tag1) { create(:tag, category: :deerjikist) }
  6. let!(:tag2) { create(:tag, category: :deerjikist) }
  7. let(:member) { create(:user, :member) }
  8. let(:guest) { create(:user, role: :guest) }
  9. describe 'GET /deerjikists/:platform/:code' do
  10. subject(:do_request) do
  11. get "/deerjikists/#{ platform }/#{ code }"
  12. end
  13. context 'when deerjikist exists' do
  14. before do
  15. Deerjikist.create!(platform:, code:, tag: tag1)
  16. end
  17. it 'returns 200 and deerjikist json' do
  18. do_request
  19. expect(response).to have_http_status(:ok)
  20. expect(json).to be_a(Hash)
  21. expect(json['platform']).to eq(platform)
  22. expect(json['code']).to eq(code)
  23. expect(json['tag']).to be_a(Hash)
  24. expect(json['tag']['id']).to eq(tag1.id)
  25. expect(json['tag']['name']).to eq(tag1.name)
  26. end
  27. end
  28. context 'when deerjikist does not exist' do
  29. it 'returns 404' do
  30. do_request
  31. expect(response).to have_http_status(:not_found)
  32. end
  33. end
  34. context 'when platform or code become blank after strip' do
  35. it 'returns 400' do
  36. get '/deerjikists/%20/%20'
  37. expect(response).to have_http_status(:bad_request)
  38. end
  39. end
  40. end
  41. describe 'PUT /deerjikists/:platform/:code' do
  42. subject(:do_request) do
  43. put "/deerjikists/#{ platform }/#{ code }", params: payload
  44. end
  45. let(:payload) { { tag_id: tag1.id } }
  46. context 'when not legged in' do
  47. it 'returns 401' do
  48. sign_out
  49. do_request
  50. expect(response).to have_http_status(:unauthorized)
  51. end
  52. end
  53. context 'when logged in but not member' do
  54. it 'returns 403' do
  55. sign_in_as guest
  56. do_request
  57. expect(response).to have_http_status(:forbidden)
  58. end
  59. end
  60. context 'when member' do
  61. before do
  62. sign_in_as member
  63. end
  64. context 'when params invalid' do
  65. it 'returns 400 when tag_id is missing or invalid' do
  66. put "/deerjikists/#{ platform }/#{ code }", params: { tag_id: 0 }
  67. expect(response).to have_http_status(:bad_request)
  68. end
  69. it 'returns 400 when platform or code blank after strip' do
  70. put '/deerjikists/%20/%20', params: { tag_id: tag1.id }
  71. expect(response).to have_http_status(:bad_request)
  72. end
  73. end
  74. context 'when creating new deerjikist' do
  75. it 'creates and returns 200 with json' do
  76. expect { do_request }.to change { Deerjikist.count }.by(1)
  77. expect(response).to have_http_status(:ok)
  78. d = Deerjikist.find_by(platform:, code:)
  79. expect(d).to be_present
  80. expect(d.tag_id).to eq(tag1.id)
  81. expect(json['platform']).to eq(platform)
  82. expect(json['code']).to eq(code)
  83. end
  84. end
  85. context 'when updating existing deerjikist' do
  86. before do
  87. Deerjikist.create!(platform:, code:, tag: tag1)
  88. end
  89. let(:payload) { { tag_id: tag2.id } }
  90. it 'updates tag_id and returns 200' do
  91. expect { do_request }.not_to change { Deerjikist.count }
  92. expect(response).to have_http_status(:ok)
  93. d = Deerjikist.find_by(platform:, code:)
  94. expect(d.tag_id).to eq(tag2.id)
  95. expect(json['platform']).to eq(platform)
  96. expect(json['code']).to eq(code)
  97. end
  98. end
  99. end
  100. end
  101. describe 'DELETE /deerjikists/:platform/:code' do
  102. subject(:do_request) do
  103. delete "/deerjikists/#{ platform }/#{ code }"
  104. end
  105. context 'when not logged in' do
  106. it 'returns 401' do
  107. sign_out
  108. do_request
  109. expect(response).to have_http_status(:unauthorized)
  110. end
  111. end
  112. context 'when logged in but not member' do
  113. it 'returns 403' do
  114. sign_in_as guest
  115. do_request
  116. expect(response).to have_http_status(:forbidden)
  117. end
  118. end
  119. context 'when member' do
  120. before do
  121. sign_in_as member
  122. end
  123. it 'returns 400 when platform/code blank after strip' do
  124. delete '/deerjikists/%20/%20'
  125. expect(response).to have_http_status(:bad_request)
  126. end
  127. context 'when deerjikist exists' do
  128. before do
  129. Deerjikist.create!(platform: platform, code: code, tag: tag1)
  130. end
  131. it 'destroys and returns 204' do
  132. expect {
  133. do_request
  134. }.to change { Deerjikist.exists?(platform: platform, code: code) }
  135. .from(true).to(false)
  136. expect(response).to have_http_status(:no_content)
  137. end
  138. end
  139. context 'when deerjikist does not exist' do
  140. it 'returns 404' do
  141. do_request
  142. expect(response).to have_http_status(:not_found)
  143. end
  144. end
  145. end
  146. end
  147. end