pokemon_controller_spec.rb 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe API::V1::PokemonController, type: :controller do
  4. def non_existant_pokemon_id(initial_id = 1)
  5. id = initial_id
  6. id *= 2 while Pokemon.find_by(id: id)
  7. id
  8. end
  9. describe 'DELETE #destroy' do
  10. let!(:pokemon) { FactoryBot.create(:pokemon) }
  11. subject { delete :destroy, params: {id: pokemon.id} }
  12. context 'the pokemon is successfully deleted' do
  13. it 'deletes the pokemon' do
  14. expect{subject}.to change{Pokemon.count}.by(-1)
  15. expect(response).to render_template 'api/v1/pokemon/show'
  16. end
  17. end
  18. context 'the pokemon is not deleted' do
  19. before { allow_any_instance_of(Pokemon).to receive(:destroy).and_return(false) }
  20. it 'does not delete the pokemon' do
  21. expect{subject}.to change{Pokemon.count}.by(0)
  22. expect(response).to render_template 'api/v1/application/_error'
  23. end
  24. end
  25. context 'the pokemon does not exist' do
  26. let(:pokemon) { double(id: non_existant_pokemon_id) }
  27. it 'raises an error' do
  28. expect{subject rescue nil}.to change{Pokemon.count}.by(0)
  29. expect(response).to render_template 'api/v1/application/_error'
  30. end
  31. end
  32. end
  33. describe 'POST #upload' do
  34. subject { post :upload, params: {pokemon: double} }
  35. let(:client_response) { double(pokemon: [pokemon]) }
  36. let(:pokemon) do
  37. double(pokedex_number: 10, nickname: 'pyukuchu', to_h: {pokedex_number: 10, nickname: 'pyukuchu'})
  38. end
  39. before do
  40. allow_any_instance_of(PKParse::Client).to receive(:parse).and_return(client_response)
  41. end
  42. context 'parsing succeeds' do
  43. context 'committing result to database fails' do
  44. before { allow(Pokemon).to receive(:create!).and_raise(ActiveRecord::ActiveRecordError.new) }
  45. it 'does not create any new pokemon' do
  46. # expect{subject}.to raise_error 'canned failure'
  47. expect{(subject rescue nil)}.to change{Pokemon.count}.by(0)
  48. expect(response).to render_template 'api/v1/application/_error'
  49. end
  50. end
  51. context 'committing result to database succeeds' do
  52. before do
  53. allow_any_instance_of(PKParse::Client).to receive(:parse).and_return(client_response)
  54. end
  55. it 'creates some new pokemon' do
  56. expect{subject}.to change{Pokemon.count}.by(1)
  57. expect(response).to render_template 'api/v1/pokemon/index'
  58. end
  59. end
  60. end
  61. context 'parsing fails' do
  62. before do
  63. allow_any_instance_of(PKParse::Client).to receive(:parse).and_raise(PKParse::Error.new(StandardError.new))
  64. end
  65. it 'does not create any new pokemon' do
  66. expect{subject}.to change{Pokemon.count}.by(0)
  67. expect(response).to render_template 'api/v1/application/_error'
  68. end
  69. end
  70. end
  71. describe 'GET #show' do
  72. context 'the pokemon exists' do
  73. let!(:pokemon) { FactoryBot.create(:pokemon) }
  74. subject { get :show, params: {id: pokemon.id}, format: :json }
  75. it 'renders the pokemon JSON' do
  76. subject
  77. expect(response).to render_template 'api/v1/pokemon/show'
  78. end
  79. end
  80. end
  81. end