From d3ddf3b11407620509c72f192ea18d851d30a815 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 21 Nov 2012 14:49:00 -0500 Subject: [PATCH] VRFS-81 - recording/favorite development --- app/controllers/api_bands_controller.rb | 46 ++-- app/controllers/api_users_controller.rb | 116 +++++++--- app/views/api_bands/recording_create.rabl | 0 app/views/api_bands/recording_index.rabl | 0 app/views/api_bands/recording_show.rabl | 0 app/views/api_bands/recording_update.rabl | 0 app/views/api_users/band_following_index.rabl | 27 +++ app/views/api_users/favorite_index.rabl | 11 + app/views/api_users/recording_create.rabl | 0 app/views/api_users/recording_index.rabl | 3 + app/views/api_users/recording_show.rabl | 0 app/views/api_users/recording_update.rabl | 0 app/views/api_users/show.rabl | 2 +- config/routes.rb | 17 +- spec/factories.rb | 20 +- spec/requests/bands_api_spec.rb | 0 spec/requests/search_api_spec.rb | 6 +- spec/requests/users_api_spec.rb | 203 +++++++++++++----- 18 files changed, 339 insertions(+), 112 deletions(-) create mode 100644 app/views/api_bands/recording_create.rabl create mode 100644 app/views/api_bands/recording_index.rabl create mode 100644 app/views/api_bands/recording_show.rabl create mode 100644 app/views/api_bands/recording_update.rabl create mode 100644 app/views/api_users/band_following_index.rabl create mode 100644 app/views/api_users/recording_create.rabl create mode 100644 app/views/api_users/recording_index.rabl create mode 100644 app/views/api_users/recording_show.rabl create mode 100644 app/views/api_users/recording_update.rabl create mode 100644 spec/requests/bands_api_spec.rb diff --git a/app/controllers/api_bands_controller.rb b/app/controllers/api_bands_controller.rb index 96b156b78..ce607d569 100644 --- a/app/controllers/api_bands_controller.rb +++ b/app/controllers/api_bands_controller.rb @@ -1,7 +1,7 @@ class ApiBandsController < ApplicationController - before_filter :api_signed_in_user, only: [:index, :show, :create, :update, - :following_create, :following_destroy] + before_filter :api_signed_in_user, :only => [:index, :show, :create, :update, + :following_create, :following_destroy] respond_to :json @@ -14,7 +14,14 @@ class ApiBandsController < ApplicationController end def create - @band = Band.save(params) + @band = Band.save(params[:id], + params[:name], + params[:website], + params[:biography], + params[:city], + params[:state], + params[:country], + params[:genres]) respond_with @band, responder: ApiResponder, :location => api_band_detail_url(@band) =begin @@ -31,7 +38,14 @@ class ApiBandsController < ApplicationController end def update - @band = Band.save(params) + @band = Band.save(params[:id], + params[:name], + params[:website], + params[:biography], + params[:city], + params[:state], + params[:country], + params[:genres]) # check for errors if @band.errors.nil? || @band.errors.size == 0 @@ -44,25 +58,25 @@ class ApiBandsController < ApplicationController end end - # FOLLOWERS + ###################### FOLLOWERS ######################## def follower_index # NOTE: follower_index.rabl template references the followers property @band = Band.find(params[:id]) end - # FOLLOWINGS - def following_create - @follower = BandFollower.new() - @follower.user_id = params[:follower_id] - @follower.follower_id = params[:id] - @follower.save - @user = User.find(params[:follower_id]) - respond_with @user, responder: ApiResponder, :location => api_following_index_url(@user) + ###################### RECORDINGS ####################### + def recording_index + @recordings = Recording.paginate(page: params[:page]) end - def following_destroy - JamRuby::BandFollower.delete_all "(user_id = '#{params[:user_id]}' AND band_id = '#{params[:id]}')" - respond_with responder: ApiResponder + def recording_create + Recording.save(params[:recording_id], + params[:public], + params[:description], + params[:id], + true) end + def recording_destroy + end end \ No newline at end of file diff --git a/app/controllers/api_users_controller.rb b/app/controllers/api_users_controller.rb index 472efa7b8..db161879b 100644 --- a/app/controllers/api_users_controller.rb +++ b/app/controllers/api_users_controller.rb @@ -1,9 +1,6 @@ class ApiUsersController < ApiController - before_filter :api_signed_in_user, only: [:index, :show, :update, :delete, - :friend_request_index, :friend_request_show, - :friend_request_create, :friend_request_update, - :friend_index, :friend_destroy] + before_filter :api_signed_in_user, :except => [:create, :signup_confirm, :auth_session_create] respond_to :json @@ -56,7 +53,21 @@ class ApiUsersController < ApiController end def update - @user = User.save(params) + auth_user(params[:id]) + @user = User.save(params[:id], + params[:first_name], + params[:last_name], + params[:email], + params[:password], + params[:password_confirmation], + params[:musician], + params[:gender], + params[:birth_date], + params[:internet_service_provider], + params[:city], + params[:state], + params[:country], + params[:instruments]) # check for errors if @user.errors.nil? || @user.errors.size == 0 @@ -67,7 +78,6 @@ class ApiUsersController < ApiController response.status = :unprocessable_entity respond_with @user end - # FRIENDS end def delete @@ -85,33 +95,80 @@ class ApiUsersController < ApiController ###################### FOLLOWINGS ####################### def following_index @user = User.find(params[:id]) + end - # TODO: get band followings and merge (@user.band_followings) + def band_following_index + @user = User.find(params[:id]) end def following_create + id = params[:id] + auth_user(id) + @user = User.find(id) if !params[:user_id].nil? - @follower = UserFollower.new() - @follower.user_id = params[:user_id] - @follower.follower_id = params[:id] + User.create_user_following(params[:user_id], id) + respond_with @user, responder: ApiResponder, :location => api_user_following_index_url(@user) elsif !params[:band_id].nil? - @follower = BandFollower.new() - @follower.band_id = params[:band_id] - @follower.follower_id = params[:id] + User.create_band_following(params[:band_id], id) + respond_with @user, responder: ApiResponder, :location => api_band_following_index_url(@user) end - - @follower.save - @user = User.find(params[:id]) - respond_with @user, responder: ApiResponder, :location => api_following_index_url(@user) end def following_destroy - JamRuby::UserFollower.delete_all "(user_id = '#{params[:user_id]}' AND follower_id = '#{params[:id]}')" - #JamRuby::BandFollower.delete_all "(band_id = '#{params[:band_id]}' AND follower_id = '#{params[:id]}')" + auth_user(params[:id]) + User.delete_user_following(params[:user_id], params[:id]) respond_with responder: ApiResponder end + ###################### RECORDINGS ####################### + def recording_index + @recordings = Recording.where("user_id=#{params[:id]}").paginate(page: params[:page]) + end + + def recording_create + auth_user(params[:id]) + @recording = Recording.save(params[:recording_id], + params[:public], + params[:description], + params[:id], + false) + + # check for errors + if @recording.errors.nil? || @recording.errors.size == 0 + respond_with @recording, responder: ApiResponder, :status => 201, :location => api_recording_detail_url(@recording) + + else + raise ActiveRecord::Rollback + response.status = :unprocessable_entity + respond_with @recording + end + end + + def recording_update + auth_user(params[:id]) + @recording = Recording.save(params[:recording_id], + params[:public], + params[:description], + params[:id], + false) + + # check for errors + if @recording.errors.nil? || @recording.errors.size == 0 + respond_with @recording, responder: ApiResponder, :status => 200 + + else + raise ActiveRecord::Rollback + response.status = :unprocessable_entity + respond_with @recording + end + end + + def recording_destroy + auth_user(params[:id]) + Recording.delete(params[:recording_id], params[:id], false) + end + ###################### FAVORITES ######################## def favorite_index @user = User.find(params[:id]) @@ -120,31 +177,34 @@ class ApiUsersController < ApiController end def favorite_create - @follower = UserFavorite.new() - @follower.user_id = params[:user_id] - @follower.follower_id = params[:id] + auth_user(params[:id]) + @favorite = UserFavorite.new() + User.create_favorite(params[:id], params[:recording_id]) - @follower.save @user = User.find(params[:id]) respond_with @user, responder: ApiResponder, :location => api_favorite_index_url(@user) end def favorite_destroy - JamRuby::UserFavorite.delete_all "(user_id = '#{params[:id]}' AND recording_id = '#{params[:recording_id]}')" + auth_user(params[:id]) + User.delete_favorite(params[:id], params[:recording_id]) respond_with responder: ApiResponder end ###################### FRIENDS ########################## def friend_request_index + auth_user(params[:id]) # get all outgoing and incoming friend requests @friend_requests = FriendRequest.where("(friend_id='#{params[:id]}' OR user_id='#{params[:id]}') AND accepted is null") end def friend_request_show + auth_user(params[:id]) @friend_request = FriendRequest.find(params[:id]) end def friend_request_create + auth_user(params[:user_id]) @friend_request = FriendRequest.new() @friend_request.user_id = params[:user_id] @friend_request.friend_id = params[:friend_id] @@ -181,6 +241,7 @@ class ApiUsersController < ApiController end def friend_destroy + auth_user(params[:id]) # clean up both records representing this "friendship" JamRuby::Friendship.delete_all "(user_id = '#{params[:id]}' AND friend_id = '#{params[:friend_id]}') OR (user_id = '#{params[:friend_id]}' AND friend_id = '#{params[:id]}')" respond_with responder: ApiResponder @@ -202,4 +263,11 @@ class ApiUsersController < ApiController sign_out render :json => { :success => true }, :status => 200 end + + protected + def auth_user(id) + if current_user.id != id + raise PermissionError, "You do not have permissions to perform this action." + end + end end \ No newline at end of file diff --git a/app/views/api_bands/recording_create.rabl b/app/views/api_bands/recording_create.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_bands/recording_index.rabl b/app/views/api_bands/recording_index.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_bands/recording_show.rabl b/app/views/api_bands/recording_show.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_bands/recording_update.rabl b/app/views/api_bands/recording_update.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_users/band_following_index.rabl b/app/views/api_users/band_following_index.rabl new file mode 100644 index 000000000..9feeef9c4 --- /dev/null +++ b/app/views/api_users/band_following_index.rabl @@ -0,0 +1,27 @@ +object @user.band_followings + +attributes :band_id + +node :name do |following| + following.band.name +end + +node :city do |following| + following.band.city +end + +node :state do |following| + following.band.state +end + +node :country do |following| + following.band.country +end + +node :photo_url do |following| + following.band.photo_url +end + +node :logo_url do |following| + following.band.logo_url +end \ No newline at end of file diff --git a/app/views/api_users/favorite_index.rabl b/app/views/api_users/favorite_index.rabl index e69de29bb..8c5da0be7 100644 --- a/app/views/api_users/favorite_index.rabl +++ b/app/views/api_users/favorite_index.rabl @@ -0,0 +1,11 @@ +object @user.favorites + +attributes :recording_id + +node :description do |favorite| + favorite.recording.description +end + +node :public do |favorite| + favorite.recording.public +end \ No newline at end of file diff --git a/app/views/api_users/recording_create.rabl b/app/views/api_users/recording_create.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_users/recording_index.rabl b/app/views/api_users/recording_index.rabl new file mode 100644 index 000000000..e7df79f18 --- /dev/null +++ b/app/views/api_users/recording_index.rabl @@ -0,0 +1,3 @@ +object @user + +extends "api_users/show" \ No newline at end of file diff --git a/app/views/api_users/recording_show.rabl b/app/views/api_users/recording_show.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_users/recording_update.rabl b/app/views/api_users/recording_update.rabl new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/api_users/show.rabl b/app/views/api_users/show.rabl index 6c1a808b5..f1583fd80 100644 --- a/app/views/api_users/show.rabl +++ b/app/views/api_users/show.rabl @@ -1,6 +1,6 @@ object @user -attributes :id, :first_name, :last_name, :city, :state, :country, :online, :photo_url, :musician, :gender, :birth_date, :internet_service_provider, :friend_count, :follower_count, :following_count +attributes :id, :first_name, :last_name, :city, :state, :country, :online, :photo_url, :musician, :gender, :birth_date, :internet_service_provider, :friend_count, :follower_count, :following_count, :favorite_count unless @user.friends.nil? || @user.friends.size == 0 child :friends => :friends do diff --git a/config/routes.rb b/config/routes.rb index 427728624..b47448fde 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -47,9 +47,7 @@ SampleApp::Application.routes.draw do match '/genres' => 'api_genres#index', :via => :get # recordings - match '/recordings' => 'api_recordings#create', :via => :post match '/recordings/:id' => 'api_recordings#show', :via => :get, :as => 'api_recording_detail' - match '/recordings/:id' => 'api_recordings#update', :via => :post # users match '/users' => 'api_users#index', :via => :get @@ -77,13 +75,17 @@ SampleApp::Application.routes.draw do match '/users/:id/followers' => 'api_users#follower_index', :via => :get # user followings - match '/users/:id/followings' => 'api_users#following_index', :via => :get, :as => 'api_following_index' + match '/users/:id/followings' => 'api_users#following_index', :via => :get, :as => 'api_user_following_index' + match '/users/:id/band_followings' => 'api_users#band_following_index', :via => :get, :as => 'api_band_following_index' match '/users/:id/followings' => 'api_users#following_create', :via => :post match '/users/:id/followings/:user_id' => 'api_users#following_destroy', :via => :delete # user recordings match '/users/:id/recordings' => 'api_users#recording_index', :via => :get - match '/users/:id/recordings/:recording_id' => 'api_users#recording_delete', :via => :delete + match '/users/:id/recordings/:recording_id' => 'api_users#recording_show', :via => :get, :as => 'api_recording_detail' + match '/users/:id/recordings' => 'api_users#recording_create', :via => :post + match '/users/:id/recordings/:recording_id' => 'api_users#recording_update', :via => :post + match '/users/:id/recordings/:recording_id' => 'api_users#recording_destroy', :via => :delete # favorites match '/users/:id/favorites' => 'api_users#favorite_index', :via => :get, :as => 'api_favorite_index' @@ -101,7 +103,10 @@ SampleApp::Application.routes.draw do # band recordings match '/bands/:id/recordings' => 'api_bands#recording_index', :via => :get - match '/bands/:id/recordings/:recording_id' => 'api_bands#recording_delete', :via => :delete + match '/bands/:id/recordings/:recording_id' => 'api_bands#recording_show', :via => :get + match '/bands/:id/recordings' => 'api_bands#recording_create', :via => :post + match '/bands/:id/recordings/:recording_id' => 'api_bands#recording_update', :via => :post + match '/bands/:id/recordings/:recording_id' => 'api_bands#recording_destroy', :via => :delete # invitations match '/invitations/:id' => 'api_invitations#show', :via => :get, :as => 'api_invitation_detail' @@ -109,7 +114,7 @@ SampleApp::Application.routes.draw do match '/invitations' => 'api_invitations#index', :via => :get match '/invitations' => 'api_invitations#create', :via => :post - # invitations + # instruments match '/instruments/:id' => 'api_instruments#show', :via => :get, :as => 'api_instrument_detail' match '/instruments' => 'api_instruments#index', :via => :get diff --git a/spec/factories.rb b/spec/factories.rb index a538e9619..96ced3473 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -1,19 +1,22 @@ FactoryGirl.define do - factory :user, :class => "JamRuby::User" do + factory :user, :class => JamRuby::User do + sequence(:email) { |n| "person_#{n}@example.com"} sequence(:first_name) { |n| "Person" } sequence(:last_name) { |n| "#{n}" } - sequence(:email) { |n| "person_#{n}@example.com"} password "foobar" password_confirmation "foobar" email_confirmed true musician true + city "Apex" + state "NC" + country "USA" factory :admin do admin true end end - factory :fan, :class => "JamRuby::User" do + factory :fan, :class => JamRuby::User do sequence(:first_name) { |n| "Person" } sequence(:last_name) { |n| "#{n}" } sequence(:email) { |n| "person_#{n}@example.com"} @@ -21,9 +24,12 @@ FactoryGirl.define do password_confirmation "foobar" email_confirmed true musician false + city "Apex" + state "NC" + country "USA" end - factory :music_session, :class => "JamRuby::MusicSession" do + factory :music_session, :class => JamRuby::MusicSession do sequence(:description) { |n| "Music Session #{n}" } fan_chat true fan_access true @@ -44,6 +50,10 @@ FactoryGirl.define do end factory :band, :class => JamRuby::Band do - + sequence(:name) { |n| "Band" } + biography "Established 1978" + city "Apex" + state "NC" + country "USA" end end diff --git a/spec/requests/bands_api_spec.rb b/spec/requests/bands_api_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/spec/requests/search_api_spec.rb b/spec/requests/search_api_spec.rb index 32d57308e..8a17c65b5 100644 --- a/spec/requests/search_api_spec.rb +++ b/spec/requests/search_api_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe "Search API ", :type => :api do +describe "Search API", :type => :api do include Rack::Test::Methods @@ -30,8 +30,8 @@ describe "Search API ", :type => :api do User.create_search_index @musician = FactoryGirl.create(:user, first_name: "Peach", last_name: "Nothing", email: "user@example.com", musician: true) @fan = FactoryGirl.create(:user, first_name: "Peach Peach", last_name: "Grovery", email: "fan@example.com", musician: false) - @band = Band.save(name: "Peach pit", website: "www.bands.com", biography: "zomg we rock") - @band2 = Band.save(name: "Peach", website: "www.bands2.com", biography: "zomg we rock") + @band = Band.save(nil, "Peach pit", "www.bands.com", "zomg we rock", "Apex", "NC", "USA", nil) + @band2 = Band.save(nil, "Peach", "www.bands2.com", "zomg we rock", "Apex", "NC", "USA", nil) User.search_index.refresh Band.search_index.refresh diff --git a/spec/requests/users_api_spec.rb b/spec/requests/users_api_spec.rb index 519c3f31d..0e3509b12 100644 --- a/spec/requests/users_api_spec.rb +++ b/spec/requests/users_api_spec.rb @@ -6,7 +6,7 @@ describe "User API", :type => :api do subject { page } - describe "profile page" do + describe "profile" do let(:user) { FactoryGirl.create(:user) } let(:fan) { FactoryGirl.create(:fan) } @@ -14,74 +14,163 @@ describe "User API", :type => :api do UserMailer.deliveries.clear end - def login(login_user) + def login(email, password, http_code, success) # login as fan - post '/api/auth_session.json', { :email => login_user.email, :password => login_user.password }.to_json, "CONTENT_TYPE" => 'application/json' - last_response.status.should == 200 - JSON.parse(last_response.body).should == { "success" => true } + 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 + context "unauthenticated user" do - it "successful login" do - # can't access most apis; not logged in yet!' - get '/api/users.json', "CONTENT_TYPE" => 'application/json' - last_response.status.should == 403 + it "should allow successful login" do + # can't access most apis; not logged in yet!' + get '/api/users.json', "CONTENT_TYPE" => 'application/json' + last_response.status.should == 403 - # login - login(user) + # login + login(user.email, user.password, 200, true) - # can now login - get '/api/users.json', "CONTENT_TYPE" => 'application/json' - last_response.status.should == 200 + # can now login + get '/api/users.json', "CONTENT_TYPE" => 'application/json' + last_response.status.should == 200 - # log back out - delete '/api/auth_session.json', "CONTENT_TYPE" => 'application/json' + # log back out + delete '/api/auth_session.json', "CONTENT_TYPE" => 'application/json' - # can't access most apis; not logged in yet!' - get '/api/users.json', "CONTENT_TYPE" => 'application/json' - last_response.status.should == 403 + # can't access most apis; not logged in yet!' + get '/api/users.json', "CONTENT_TYPE" => 'application/json' + last_response.status.should == 403 + end + + it "should deny bad login" do + # login + login("nothing", "mur", 404, false) + + # can't access most apis; not logged in yet!' + get '/api/users.json', "CONTENT_TYPE" => 'application/json' + last_response.status.should == 403 + end end - it "bad login" do - # login - post '/api/auth_session.json', { :email => "nothing", :password => "mur" }.to_json, "CONTENT_TYPE" => 'application/json' - last_response.status.should == 404 - JSON.parse(last_response.body).should == { "success" => false } + context "authenticated user" do + # log in a valid user +=begin + before do + puts "logging in" + post '/sessions', "session[email]" => fan.email, "session[password]" => fan.password + rack_mock_session.cookie_jar["remember_token"].should == fan.remember_token + end +=end - # can't access most apis; not logged in yet!' - get '/api/users.json', "CONTENT_TYPE" => 'application/json' - last_response.status.should == 403 + it "should allow user updates" do + + # login as fan + login(fan.email, fan.password, 200, true) + + # update the user's first name and musician flag' + post "/api/users/#{fan.id}.json", { :first_name => "Brian", :musician => true }.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should == 200 + + # login as fan (credentials are not saved between API calls) + login(fan.email, fan.password, 200, true) + + # get the user's details + get "/api/users/#{fan.id}.json", "CONTENT_TYPE" => 'application/json' + last_response.status.should == 200 + updated_user = JSON.parse(last_response.body) + updated_user["musician"].should == true + updated_user["first_name"].should == "Brian" + end + + it "should allow user to follow user" do + # create user following + login(user.email, user.password, 200, true) + post "/api/users/#{user.id}/followings.json", { :user_id => fan.id }.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should == 201 + + # get following + login(user.email, user.password, 200, true) + get "/api/users/#{user.id}/followings.json" + last_response.status.should == 200 + followings = JSON.parse(last_response.body) + followings.size.should == 1 + followings[0]["user_id"].should == fan.id + + # get followers for for fan + login(fan.email, fan.password, 200, true) + get "/api/users/#{fan.id}/followers.json" + last_response.status.should == 200 + followers = JSON.parse(last_response.body) + followers.size.should == 1 + followers[0]["user_id"].should == user.id + end + + it "should allow user to follow band" do + # create band following + login(user.email, user.password, 200, true) + band = FactoryGirl.create(:band) + post "/api/users/#{user.id}/followings.json", { :band_id => band.id }.to_json, "CONTENT_TYPE" => 'application/json' + + # get following + login(user.email, user.password, 200, true) + get "/api/users/#{user.id}/band_followings.json" + last_response.status.should == 200 + followings = JSON.parse(last_response.body) + followings.size.should == 1 + followings[0]["band_id"].should == band.id + + # get followers for band + login(user.email, user.password, 200, true) + get "/api/bands/#{band.id}/followers.json" + last_response.status.should == 200 + followers = JSON.parse(last_response.body) + followers.size.should == 1 + followers[0]["user_id"].should == user.id + + # delete followings + end + + it "should not allow user to create following for another user" do + login(user.email, user.password, 200, true) + post "/api/users/2/followings.json", { :user_id => fan.id }.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should == 500 + end + + it "should not allow user to delete following of another user" do + end + + it "should allow musician to create recordings" do + login(user.email, user.password, 200, true) + end + + it "should not allow fan to create recordings" do + end + + it "should allow user to get recordings" do + end + + it "should allow user to create favorites" do + end + + it "should allow user to delete favorites" do + end + + it "should allow musician to create band" do + end + + it "should not allow fan to create band" do + end + + it "should allow user to send friend request" do + end + + it "should allow user to accept friend request" do + end + + it "should allow user to deny friend request" do + end end - - it "allows user to update attributes" do - - # login as fan - login(fan) - - # update the user's first name and musician flag' - post '/api/users/' + fan.id + '.json', { :first_name => "Brian", :musician => true }.to_json, "CONTENT_TYPE" => 'application/json' - last_response.status.should == 200 - - # login as fan - login(fan) - - # get the user's details - get '/api/users/' + fan.id + '.json', "CONTENT_TYPE" => 'application/json' - last_response.status.should == 200 - updated_user = JSON.parse(last_response.body) - updated_user["musician"].should == true - updated_user["first_name"].should == "Brian" - end - - it "allows user to add followings" do - end - - it "can get followers" do - end - - it "allows user to delete followings" do - end - end end