- create gw_events, crew_gw_participations, gw_crew_scores, gw_individual_scores - add models, blueprints, controllers for GW tracking - add model specs and gw_events controller specs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
114 lines
3.6 KiB
Ruby
114 lines
3.6 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe 'Api::V1::GwEvents', type: :request do
|
|
let(:user) { create(:user) }
|
|
let(:admin) { create(:user, role: 9) }
|
|
let(:access_token) do
|
|
Doorkeeper::AccessToken.create!(resource_owner_id: user.id, expires_in: 30.days, scopes: 'public')
|
|
end
|
|
let(:admin_token) do
|
|
Doorkeeper::AccessToken.create!(resource_owner_id: admin.id, expires_in: 30.days, scopes: 'public')
|
|
end
|
|
let(:auth_headers) { { 'Authorization' => "Bearer #{access_token.token}" } }
|
|
let(:admin_headers) { { 'Authorization' => "Bearer #{admin_token.token}" } }
|
|
|
|
describe 'GET /api/v1/gw_events' do
|
|
let!(:upcoming_event) { create(:gw_event, :upcoming) }
|
|
let!(:active_event) { create(:gw_event, :active) }
|
|
let!(:finished_event) { create(:gw_event, :finished) }
|
|
|
|
it 'returns all events' do
|
|
get '/api/v1/gw_events'
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['gw_events'].length).to eq(3)
|
|
end
|
|
end
|
|
|
|
describe 'GET /api/v1/gw_events/:id' do
|
|
let!(:event) { create(:gw_event) }
|
|
|
|
it 'returns the event' do
|
|
get "/api/v1/gw_events/#{event.id}"
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['gw_event']['id']).to eq(event.id)
|
|
expect(json_response['gw_event']['name']).to eq(event.name)
|
|
expect(json_response['gw_event']['element']).to eq(event.element)
|
|
end
|
|
|
|
it 'returns 404 for non-existent event' do
|
|
get '/api/v1/gw_events/00000000-0000-0000-0000-000000000000'
|
|
expect(response).to have_http_status(:not_found)
|
|
end
|
|
end
|
|
|
|
describe 'POST /api/v1/gw_events' do
|
|
let(:valid_params) do
|
|
{
|
|
gw_event: {
|
|
name: 'Unite and Fight #50',
|
|
element: 'Fire',
|
|
start_date: 1.week.from_now.to_date,
|
|
end_date: 2.weeks.from_now.to_date,
|
|
event_number: 50
|
|
}
|
|
}
|
|
end
|
|
|
|
context 'as admin' do
|
|
it 'creates a new event' do
|
|
expect {
|
|
post '/api/v1/gw_events', params: valid_params, headers: admin_headers
|
|
}.to change(GwEvent, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:created)
|
|
expect(json_response['gw_event']['name']).to eq('Unite and Fight #50')
|
|
expect(json_response['gw_event']['element']).to eq('Fire')
|
|
end
|
|
|
|
it 'returns errors for invalid params' do
|
|
post '/api/v1/gw_events', params: { gw_event: { name: '' } }, headers: admin_headers
|
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
end
|
|
end
|
|
|
|
context 'as regular user' do
|
|
it 'returns unauthorized' do
|
|
post '/api/v1/gw_events', params: valid_params, headers: auth_headers
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
|
|
context 'without authentication' do
|
|
it 'returns unauthorized' do
|
|
post '/api/v1/gw_events', params: valid_params
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'PUT /api/v1/gw_events/:id' do
|
|
let!(:event) { create(:gw_event) }
|
|
let(:update_params) { { gw_event: { name: 'Updated Event Name' } } }
|
|
|
|
context 'as admin' do
|
|
it 'updates the event' do
|
|
put "/api/v1/gw_events/#{event.id}", params: update_params, headers: admin_headers
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['gw_event']['name']).to eq('Updated Event Name')
|
|
end
|
|
end
|
|
|
|
context 'as regular user' do
|
|
it 'returns unauthorized' do
|
|
put "/api/v1/gw_events/#{event.id}", params: update_params, headers: auth_headers
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def json_response
|
|
JSON.parse(response.body)
|
|
end
|
|
end
|