require 'rails_helper' RSpec.describe 'Gekanator games API', type: :request do let!(:user) { create_member_user! } let!(:guessed_post) { Post.create!(title: 'guess', url: 'https://example.com/guess') } let!(:correct_post) { Post.create!(title: 'correct', url: 'https://example.com/correct') } describe 'POST /gekanator/games' do it 'stores a won game' do sign_in_as user post '/gekanator/games', params: { guessed_post_id: guessed_post.id, correct_post_id: guessed_post.id, question_count: 3, answers: [{ question_id: 'tag:1', answer: 'yes' }] } expect(response).to have_http_status(:created) game = GekanatorGame.find(json['id']) expect(game.user).to eq(user) expect(game.guessed_post).to eq(guessed_post) expect(game.correct_post).to eq(guessed_post) expect(game.won).to eq(true) expect(game.answers).to eq([{ 'question_id' => 'tag:1', 'answer' => 'yes' }]) end it 'stores a lost game with the correct post' do sign_in_as user post '/gekanator/games', params: { guessed_post_id: guessed_post.id, correct_post_id: correct_post.id, question_count: 4, answers: [{ question_id: 'tag:1', answer: 'no' }] } expect(response).to have_http_status(:created) game = GekanatorGame.find(json['id']) expect(game.correct_post).to eq(correct_post) expect(game.won).to eq(false) end it 'rejects a game without the correct post' do sign_in_as user post '/gekanator/games', params: { guessed_post_id: guessed_post.id, question_count: 4, answers: [{ question_id: 'tag:1', answer: 'no' }] } expect(response).to have_http_status(:unprocessable_entity) end it 'requires a user' do post '/gekanator/games', params: { guessed_post_id: guessed_post.id, correct_post_id: guessed_post.id, question_count: 1, answers: [] } expect(response).to have_http_status(:unauthorized) end end end