323 lines
12 KiB
Ruby
323 lines
12 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe "Band API", :type => :api do
|
|
|
|
include Rack::Test::Methods
|
|
|
|
subject { page }
|
|
|
|
describe "profile" do
|
|
let(:band) { FactoryGirl.create(:band) }
|
|
let(:user) { FactoryGirl.create(:user) }
|
|
let(:fan) { FactoryGirl.create(:fan) }
|
|
|
|
def login(email, password, http_code, success)
|
|
# login as fan
|
|
post '/api/auth_session.json', { :email => email, :password => password }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == http_code
|
|
JSON.parse(last_response.body).should == { "success" => success }
|
|
end
|
|
|
|
################################## BANDS ##################################
|
|
def create_band(authenticated_user, name, website, biography, city, state, country, genres, photo_url, logo_url)
|
|
post "/api/bands.json", { :name => name,
|
|
:website => website,
|
|
:biography => biography,
|
|
:city => city,
|
|
:state => state,
|
|
:country => country,
|
|
:genres => genres,
|
|
:photo_url => photo_url,
|
|
:logo_url => logo_url
|
|
}.to_json,
|
|
"CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def update_band(authenticated_user, band_id, name, website, biography, city, state, country, genres, photo_url, logo_url)
|
|
post "/api/bands/#{band_id}.json", { :name => name,
|
|
:website => website,
|
|
:biography => biography,
|
|
:city => city,
|
|
:state => state,
|
|
:country => country,
|
|
:genres => genres,
|
|
:photo_url => photo_url,
|
|
:logo_url => logo_url
|
|
}.to_json,
|
|
"CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def get_band(authenticated_user, band_id)
|
|
get "/api/bands/#{band_id}.json", "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
########################## RECORDINGS #########################
|
|
def create_band_recording(authenticated_user, band_id, description, public, genres)
|
|
post "/api/bands/#{band_id}/recordings.json", { :description => description, :public => public, :genres => genres }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def update_band_recording()
|
|
end
|
|
|
|
def get_band_recordings()
|
|
end
|
|
|
|
def get_band_recording()
|
|
end
|
|
|
|
def delete_band_recording()
|
|
end
|
|
|
|
########################## INVITATIONS #########################
|
|
def create_band_invitation(band_id, user_id)
|
|
post "/api/bands/#{band_id}/invitations.json", { :band_id => band_id, :user_id => user_id }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def get_band_invitations(band_id)
|
|
get "/api/bands/#{band_id}/invitations.json", "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def get_band_invitation(band_id, invitation_id)
|
|
get "/api/bands/#{band_id}/invitations/#{invitation_id}.json", "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
def delete_band_invitation(band_id, invitation_id)
|
|
delete "/api/bands/#{band_id}/invitations/#{invitation_id}.json", "CONTENT_TYPE" => 'application/json'
|
|
return last_response
|
|
end
|
|
|
|
context "when logged in as musician" do
|
|
before(:each) do
|
|
login(user.email, user.password, 200, true)
|
|
end
|
|
|
|
it "should allow band creation" do
|
|
|
|
last_response = create_band(user, "My Band", "http://www.myband.com", "Bio", "Apex", "NC", "US", ["country"], "www.photos.com", "www.logos.com")
|
|
last_response.status.should == 201
|
|
|
|
new_band = JSON.parse(last_response.body)
|
|
new_band["name"].should == "My Band"
|
|
|
|
last_response = get_band(user, new_band["id"])
|
|
last_response.status.should == 200
|
|
|
|
# ensure creator is member of band after band creation
|
|
band_details = JSON.parse(last_response.body)
|
|
band_details["id"].should == new_band["id"]
|
|
band_details["musicians"][0]["id"].should == user.id
|
|
band_details["genres"].size.should == 1
|
|
end
|
|
|
|
it "should prevent bands with less than 1 genre" do
|
|
last_response = create_band(user, "My Band", "http://www.myband.com", "Bio", "Apex", "NC", "US", nil, "www.photos.com", "www.logos.com")
|
|
last_response.status.should == 400
|
|
error_msg = JSON.parse(last_response.body)
|
|
error_msg["message"].should == ValidationMessages::GENRE_MINIMUM_NOT_MET
|
|
end
|
|
|
|
it "should prevent bands with more than 3 genres" do
|
|
last_response = create_band(user, "My Band", "http://www.myband.com", "Bio", "Apex", "NC", "US", ["african", "country", "ambient", "asian"], "www.photos.com", "www.logos.com")
|
|
last_response.status.should == 400
|
|
error_msg = JSON.parse(last_response.body)
|
|
error_msg["message"].should == ValidationMessages::GENRE_LIMIT_EXCEEDED
|
|
end
|
|
end
|
|
|
|
context "when logged in as musician who is in Band A" do
|
|
|
|
before(:each) do
|
|
login(user.email, user.password, 200, true)
|
|
band.genres << Genre.find("hip hop")
|
|
#band.genres << Genre.find("african")
|
|
#band.genres << Genre.find("country")
|
|
user.bands << band
|
|
end
|
|
|
|
it "should allow user to update attributes of band A" do
|
|
|
|
band.genres.size.should == 1
|
|
|
|
last_response = update_band(user, band.id, "Brian's Band", "http://www.briansband.com", "Bio", "Apex", "NC", "US", ["african"], "www.photos.com", "www.logos.com")
|
|
last_response.status.should == 200
|
|
|
|
updated_band = JSON.parse(last_response.body)
|
|
|
|
# spot check fields in response entity
|
|
updated_band["name"].should == "Brian's Band"
|
|
updated_band["website"].should == "http://www.briansband.com"
|
|
updated_band["genres"].size.should == 1
|
|
|
|
# retrieve the band to get details
|
|
last_response = get_band(user, band.id)
|
|
last_response.status.should == 200
|
|
band_details = JSON.parse(last_response.body)
|
|
band_details["name"].should == "Brian's Band"
|
|
band_details["website"].should == "http://www.briansband.com"
|
|
band_details["biography"].should == "Bio"
|
|
band_details["genres"].size.should == 1
|
|
end
|
|
|
|
it "should allow user to create recording for band A" do
|
|
end
|
|
|
|
it "should allow user to update recording of band A" do
|
|
end
|
|
|
|
it "should allow user to delete recording of Band A" do
|
|
end
|
|
|
|
it "should allow user to view public recording of Band A" do
|
|
end
|
|
|
|
it "should allow user to view private recording of Band A" do
|
|
end
|
|
|
|
it "should allow user to create invitation to a Musician for band A" do
|
|
|
|
# TEST 1 - CREATE INVITATION
|
|
recipient = FactoryGirl.create(:user)
|
|
last_response = create_band_invitation(band.id, recipient.id)
|
|
last_response.status.should == 201
|
|
|
|
invitation = JSON.parse(last_response.body)
|
|
|
|
# test response entity
|
|
invitation["accepted"].nil?.should == true
|
|
invitation["sender"]["id"].should == user.id
|
|
invitation["recipient"]["id"].should == recipient.id
|
|
invitation["band"]["id"].should == band.id
|
|
|
|
# test receiver relationships
|
|
recipient.received_band_invitations.size.should == 1
|
|
recipient.sent_band_invitations.size.should == 0
|
|
|
|
# test sender relationships
|
|
user.received_band_invitations.size.should == 0
|
|
user.sent_band_invitations.size.should == 1
|
|
|
|
# test band relationship
|
|
band.invitations.size.should == 1
|
|
|
|
# TEST 2 - RETRIEVE INVITATION LIST
|
|
last_response = get_band_invitations(band.id)
|
|
last_response.status.should == 200
|
|
invitations = JSON.parse(last_response.body)
|
|
invitations.size.should == 1
|
|
invitations[0]["id"].should == invitation["id"]
|
|
invitations[0]["accepted"].nil?.should == true
|
|
invitations[0]["sender"]["id"].should == user.id
|
|
invitations[0]["recipient"]["id"].should == recipient.id
|
|
invitations[0]["band"]["id"].should == band.id
|
|
|
|
# TEST 3 - RETRIEVE INVITATION DETAILS
|
|
last_response = get_band_invitation(band.id, invitation["id"])
|
|
last_response.status.should == 200
|
|
invitation_details = JSON.parse(last_response.body)
|
|
invitation_details["accepted"].nil?.should == true
|
|
invitation_details["sender"]["id"].should == user.id
|
|
invitation_details["recipient"]["id"].should == recipient.id
|
|
invitation_details["band"]["id"].should == band.id
|
|
|
|
# TEST 4 -DELETE INVITATION
|
|
last_response = delete_band_invitation(band.id, invitation["id"])
|
|
last_response.status.should == 204
|
|
|
|
# test receiver relationships
|
|
recipient.received_band_invitations.size.should == 0
|
|
recipient.sent_band_invitations.size.should == 0
|
|
|
|
# test sender relationships
|
|
user.received_band_invitations.size.should == 0
|
|
user.sent_band_invitations.size.should == 0
|
|
|
|
# test band relationship
|
|
band.invitations.size.should == 0
|
|
end
|
|
|
|
it "should not allow user to create invitation to a Fan for band A" do
|
|
recipient = FactoryGirl.create(:fan)
|
|
last_response = create_band_invitation(band.id, recipient.id)
|
|
last_response.status.should == 400
|
|
error_msg = JSON.parse(last_response.body)
|
|
error_msg["message"].should == BandInvitation::BAND_INVITATION_FAN_RECIPIENT_ERROR
|
|
|
|
# test receiver relationships
|
|
recipient.received_band_invitations.size.should == 0
|
|
recipient.sent_band_invitations.size.should == 0
|
|
|
|
# test sender relationships
|
|
user.received_band_invitations.size.should == 0
|
|
user.sent_band_invitations.size.should == 0
|
|
|
|
# test band relationship
|
|
band.invitations.size.should == 0
|
|
end
|
|
|
|
it "should raise exception when attempting to retrieve a non-existent invitation" do
|
|
# retrieve non-existent invitation
|
|
last_response = get_band_invitation(band.id, "2")
|
|
last_response.status.should == 404
|
|
error_msg = JSON.parse(last_response.body)
|
|
error_msg["message"].should == ValidationMessages::BAND_INVITATION_NOT_FOUND
|
|
end
|
|
|
|
it "should raise exception when attempting to delete a non-existent invitation" do
|
|
# delete non-existent invitation
|
|
last_response = delete_band_invitation(band.id, "2")
|
|
last_response.status.should == 404
|
|
error_msg = JSON.parse(last_response.body)
|
|
error_msg["message"].should == ValidationMessages::BAND_INVITATION_NOT_FOUND
|
|
end
|
|
end
|
|
|
|
context "when logged in as user who is not in band A" do
|
|
before(:each) do
|
|
login(user.email, user.password, 200, true)
|
|
band.genres << Genre.find("hip hop")
|
|
#band.genres << Genre.find("african")
|
|
#band.genres << Genre.find("country")
|
|
end
|
|
|
|
it "should not allow user to update attributes of band A" do
|
|
end
|
|
|
|
it "should not allow user to create invitation for band A" do
|
|
end
|
|
|
|
it "should not allow user to create recording for band A" do
|
|
end
|
|
|
|
it "should not allow user to update recording of band A" do
|
|
end
|
|
|
|
it "should not allow user to delete recording of Band A" do
|
|
end
|
|
|
|
it "should allow user to view public recording of Band A" do
|
|
end
|
|
|
|
it "should not allow user to view private recording of Band A" do
|
|
end
|
|
|
|
it "should not allow user to see invitation list of band A" do
|
|
end
|
|
end
|
|
|
|
context "when logged in as fan" do
|
|
it "should not allow band creation" do
|
|
end
|
|
|
|
it "should not allow band invitation creation" do
|
|
end
|
|
end
|
|
end
|
|
end
|