VRFS-1985 VRFS-2252 added tests
This commit is contained in:
parent
a07728ffa3
commit
21f25e51d0
|
|
@ -241,3 +241,4 @@ jam_track_available.sql
|
|||
active_jam_track.sql
|
||||
bpms_on_tap_in.sql
|
||||
jamtracks_job.sql
|
||||
text_messages.sql
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE text_messages (
|
||||
id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
source_user_id VARCHAR(64) REFERENCES users(id) ON DELETE CASCADE,
|
||||
target_user_id VARCHAR(64) REFERENCES users(id) ON DELETE CASCADE,
|
||||
message TEXT NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
|
@ -197,6 +197,7 @@ require "jam_ruby/models/jam_company"
|
|||
require "jam_ruby/models/user_sync"
|
||||
require "jam_ruby/models/video_source"
|
||||
require "jam_ruby/models/recorded_video"
|
||||
require "jam_ruby/models/text_message"
|
||||
require "jam_ruby/jam_tracks_manager"
|
||||
|
||||
include Jampb
|
||||
|
|
|
|||
|
|
@ -290,13 +290,8 @@ module JamRuby
|
|||
}
|
||||
)
|
||||
|
||||
if (offset)
|
||||
query = query.offset(offset)
|
||||
end
|
||||
|
||||
if (limit)
|
||||
query = query.limit(limit)
|
||||
end
|
||||
query = query.offset(offset) if offset
|
||||
query = query.limit(limit) if limit
|
||||
|
||||
if as_musician
|
||||
query = query.where(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
include Devise::Models
|
||||
|
||||
module JamRuby
|
||||
class TextMessage < ActiveRecord::Base
|
||||
|
||||
self.primary_key = 'id'
|
||||
|
||||
default_scope order('created_at DESC')
|
||||
|
||||
attr_accessible :target_user_id, :source_user_id, :message
|
||||
|
||||
belongs_to :target_user, :class_name => "JamRuby::User", :foreign_key => "target_user_id"
|
||||
belongs_to :source_user, :class_name => "JamRuby::User", :foreign_key => "source_user_id"
|
||||
|
||||
validates :message, length: {minimum: 1, maximum: 400}, no_profanity: true
|
||||
|
||||
def self.index(target_user_id, source_user_id, options = {})
|
||||
offset = options[:offset]
|
||||
limit = options[:limit]
|
||||
|
||||
# if not specified, default offset to 0
|
||||
offset ||= 0
|
||||
offset = offset.to_i
|
||||
|
||||
# if not specified, default limit to 10
|
||||
limit ||= 10
|
||||
limit = limit.to_i
|
||||
|
||||
TextMessage
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.where('(source_user_id = (?) AND target_user_id = (?)) OR (source_user_id = (?) AND target_user_id = (?))', source_user_id, target_user_id, target_user_id, source_user_id)
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -79,6 +79,9 @@ module JamRuby
|
|||
# self.id = followable_id in follows table
|
||||
has_many :followers, :as => :followable, :class_name => "JamRuby::Follow", :dependent => :destroy
|
||||
|
||||
# text messages
|
||||
has_many :text_messages, :class_name => "JamRuby:TextMessage", :foreign_key => "target_user_id"
|
||||
|
||||
# notifications
|
||||
has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id"
|
||||
has_many :inverse_notifications, :through => :notifications, :class_name => "JamRuby::User"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe TextMessage do
|
||||
|
||||
before do
|
||||
TextMessage.delete_all
|
||||
User.delete_all
|
||||
@target_user = FactoryGirl.create(:user)
|
||||
@source_user = FactoryGirl.create(:user)
|
||||
|
||||
@msg = TextMessage.new(:target_user_id => @target_user.id, :source_user_id => @source_user.id)
|
||||
end
|
||||
|
||||
describe "index" do
|
||||
|
||||
# it "should retrieve conversation for both users" do
|
||||
# @msg.message = "Test message"
|
||||
# @msg.save!
|
||||
|
||||
# messages = TextMessage.index(@target_user.id, @source_user.id)
|
||||
# messages.count.should == 1
|
||||
|
||||
# messages = TextMessage.index(@source_user.id, @target_user.id)
|
||||
# messages.count.should == 1
|
||||
# end
|
||||
|
||||
it "should page records" do
|
||||
11.times do |n|
|
||||
message = TextMessage.new(:target_user_id => @target_user.id, :source_user_id => @source_user.id)
|
||||
message.message = "Message #{n}"
|
||||
message.save!
|
||||
end
|
||||
|
||||
puts TextMessage.all.count
|
||||
|
||||
messages = TextMessage.index(@target_user.id, @source_user.id, {:offset => 0})
|
||||
messages.count.should == 10
|
||||
|
||||
messages = TextMessage.index(@target_user.id, @source_user.id, {:offset => 1, :limit => 1})
|
||||
messages.count.should == 1
|
||||
end
|
||||
|
||||
# it "should not allow empty message" do
|
||||
# expect { @msg.save! }.to raise_error(ActiveRecord::RecordInvalid)
|
||||
# end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
@ -163,6 +163,7 @@
|
|||
}
|
||||
$sendTextMessage.click(sendMessage);
|
||||
|
||||
// TODO: PULL FROM NEW TABLE
|
||||
rest.getNotifications(buildParams())
|
||||
.done(function (response) {
|
||||
context._.each(response, function (textMessage) {
|
||||
|
|
|
|||
|
|
@ -1258,6 +1258,7 @@
|
|||
});
|
||||
}
|
||||
|
||||
// TODO: push into new table
|
||||
function createTextMessage(options) {
|
||||
var id = getId(options);
|
||||
return $.ajax({
|
||||
|
|
@ -1269,6 +1270,17 @@
|
|||
});
|
||||
}
|
||||
|
||||
function getTextMessages(options) {
|
||||
if(!options) options = {};
|
||||
var id = getId(options);
|
||||
return $.ajax({
|
||||
type: "GET",
|
||||
url: '/api/users/' + id + '/text_messages?' + $.param(options),
|
||||
dataType: "json",
|
||||
contentType: 'application/json'
|
||||
});
|
||||
}
|
||||
|
||||
function getNotifications(options) {
|
||||
if(!options) options = {};
|
||||
var id = getId(options);
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@
|
|||
function updateNotificationList(response) {
|
||||
$.each(response, function(index, val) {
|
||||
|
||||
if(val.description == 'TEXT_MESSAGE') {
|
||||
if(val.description == context.JK.MessageType.TEXT_MESSAGE) {
|
||||
val.formatted_msg = textMessageDialog.formatTextMessage(val.message.substring(0, 200), val.source_user_id, val.source_user.name, val.message.length > 200).html();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -365,8 +365,7 @@
|
|||
var now = new Date();
|
||||
var scheduledDate = new Date(scheduledStart);
|
||||
var minutesFromStart = (scheduledDate.getTime() - now.getTime()) / (1000 * 60);
|
||||
var showButton = minutesFromStart <= MAX_MINUTES_SHOW_START;
|
||||
return showButton;
|
||||
return minutesFromStart <= MAX_MINUTES_SHOW_START;
|
||||
};
|
||||
|
||||
if (session.creator.id === context.JK.currentUserId) {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ class ApiUsersController < ApiController
|
|||
:favorite_create, :favorite_destroy, # favorites
|
||||
:friend_request_index, :friend_request_show, :friend_request_create, :friend_request_update, # friend requests
|
||||
:friend_show, :friend_destroy, # friends
|
||||
:text_message_index, # text messages
|
||||
:notification_index, :notification_destroy, # notifications
|
||||
:band_invitation_index, :band_invitation_show, :band_invitation_update, # band invitations
|
||||
:set_password, :begin_update_email, :update_avatar, :delete_avatar, :generate_filepicker_policy,
|
||||
|
|
@ -313,6 +314,12 @@ class ApiUsersController < ApiController
|
|||
respond_with responder: ApiResponder, :status => 204
|
||||
end
|
||||
|
||||
###################### TEXT MESSAGES ####################
|
||||
def text_message_index
|
||||
@text_messages = TextMessage.index(params[:target_user_id], @user.id, {:offset => params[:offset]})
|
||||
respond_with @text_messages, responder: ApiResponder, :status => 200
|
||||
end
|
||||
|
||||
###################### NOTIFICATIONS ####################
|
||||
def notification_index
|
||||
if params[:type] == 'TEXT_MESSAGE'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
collection @text_messages
|
||||
|
||||
attributes :id, :source_user_id, :target_user_id, :message, :created_at
|
||||
|
||||
node :source_user do |msg|
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
node :target_user do |msg|
|
||||
attributes :id, :name
|
||||
end
|
||||
|
|
@ -296,6 +296,10 @@ SampleApp::Application.routes.draw do
|
|||
match '/users/:id/friends/:friend_id' => 'api_users#friend_show', :via => :get, :as => 'api_friend_detail'
|
||||
match '/users/:id/friends/:friend_id' => 'api_users#friend_destroy', :via => :delete
|
||||
|
||||
# text messages
|
||||
match '/text_messages' => 'api_text_messages#index', :via => :get
|
||||
match '/text_messages' => 'api_text_messages#create', :via => :post
|
||||
|
||||
# notifications
|
||||
match '/users/:id/notifications' => 'api_users#notification_index', :via => :get
|
||||
match '/users/:id/notifications/:notification_id' => 'api_users#notification_destroy', :via => :delete
|
||||
|
|
|
|||
|
|
@ -192,6 +192,121 @@ describe "Find Session", :js => true, :type => :feature, :capybara_feature => tr
|
|||
end
|
||||
end
|
||||
|
||||
describe "start session behavior" do
|
||||
before(:each) do
|
||||
stub_const("APP_CONFIG", web_config)
|
||||
@music_session = FactoryGirl.create(:music_session, creator: user)
|
||||
|
||||
@invited_user = FactoryGirl.create(:user)
|
||||
FactoryGirl.create(:friendship, :user => @invited_user, :friend => user)
|
||||
FactoryGirl.create(:friendship, :user => user, :friend => @invited_user)
|
||||
@invitation = FactoryGirl.create(:invitation, :sender => user, :receiver => @invited_user, :music_session => @music_session)
|
||||
|
||||
@rsvp_user = FactoryGirl.create(:user)
|
||||
@rsvp_slot = FactoryGirl.create(:rsvp_slot, music_session: @music_session)
|
||||
@rsvp_request = FactoryGirl.create(:rsvp_request_for_slots, chosen: nil, user: @rsvp_user, slots: [@rsvp_slot])
|
||||
end
|
||||
|
||||
it "should always show start session link for session creator" do
|
||||
pending
|
||||
# sign in as creator
|
||||
fast_signin(user, Nav.find_session)
|
||||
find("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
fast_signout
|
||||
end
|
||||
|
||||
it "should not show start session link for anyone who is not creator, invitee, or RSVP user" do
|
||||
pending
|
||||
random_user = FactoryGirl.create(:user)
|
||||
fast_signin(random_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start")
|
||||
fast_signout
|
||||
end
|
||||
|
||||
it "should show start session link for invited or RSVP users" do
|
||||
pending
|
||||
# make session date/time TBD
|
||||
@music_session.scheduled_start = Time.now + 5.minutes
|
||||
@music_session.save!
|
||||
|
||||
# invited user
|
||||
fast_signin(@invited_user, Nav.find_session)
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
fast_signout
|
||||
|
||||
# RSVP user
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
|
||||
# now approve the RSVP
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].chosen = true
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].save!
|
||||
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
end
|
||||
|
||||
it "should not show start session link for invited or RSVP users when date/time is TBD" do
|
||||
pending
|
||||
# make session date/time TBD
|
||||
@music_session.scheduled_start = nil
|
||||
@music_session.save!
|
||||
|
||||
# invited user
|
||||
fast_signin(@invited_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
fast_signout
|
||||
|
||||
# RSVP user
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
|
||||
# now approve the RSVP
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].chosen = true
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].save!
|
||||
|
||||
# "start session" should still be hidden
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
end
|
||||
|
||||
it "should not show start session link for invited or RSVP users when more than 15 minutes remain to start time" do
|
||||
pending
|
||||
# make session date/time more than 15 min away
|
||||
@music_session.scheduled_start = Time.now + 60.minutes
|
||||
@music_session.save!
|
||||
|
||||
# invited user
|
||||
fast_signin(@invited_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
fast_signout
|
||||
|
||||
# RSVP user
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
|
||||
# now approve the RSVP
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].chosen = true
|
||||
@rsvp_request.rsvp_requests_rsvp_slots[0].save!
|
||||
|
||||
# "start session" should still be hidden
|
||||
fast_signin(@rsvp_user, Nav.find_session)
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.start", text: "Start session now?")
|
||||
page.should have_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
fast_signout
|
||||
end
|
||||
end
|
||||
|
||||
describe "rsvp behavior" do
|
||||
before(:each) do
|
||||
stub_const("APP_CONFIG", web_config)
|
||||
|
|
@ -222,10 +337,9 @@ describe "Find Session", :js => true, :type => :feature, :capybara_feature => tr
|
|||
it "RSVP text shows correctly" do
|
||||
music_session = FactoryGirl.create(:music_session, creator: user)
|
||||
|
||||
# session creator cannot cancel
|
||||
fast_signin(user, Nav.find_session)
|
||||
|
||||
find("#sessions-scheduled .rsvp-msg span.text", text: "You have been confirmed for this session. ")
|
||||
|
||||
page.should have_no_selector("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
sign_out
|
||||
|
||||
# create a slot so the session can be joined
|
||||
|
|
@ -241,15 +355,15 @@ describe "Find Session", :js => true, :type => :feature, :capybara_feature => tr
|
|||
# first state: an unconfirmed RSVP
|
||||
go_to_root
|
||||
fast_signin(finder, Nav.find_session)
|
||||
find("#sessions-scheduled .rsvp-msg span.text", text: "You have RSVP'ed to this session. ")
|
||||
find("#sessions-scheduled .rsvp-msg span.text a.cancel", text: "Cancel RSVP")
|
||||
|
||||
rsvp_request.rsvp_requests_rsvp_slots[0].chosen = true
|
||||
rsvp_request.rsvp_requests_rsvp_slots[0].save!
|
||||
|
||||
# second state: a connfirmed RSVP
|
||||
# second state: a confirmed RSVP
|
||||
go_to_root
|
||||
fast_signin(finder, Nav.find_session)
|
||||
find("#sessions-scheduled .rsvp-msg span.text", text: "You have been confirmed for this session. ")
|
||||
find("#sessions-scheduled a.cancel", text: "Cancel RSVP")
|
||||
|
||||
|
||||
# need to now CANCEL, and check what it says: // VRFS-1891
|
||||
|
|
|
|||
Loading…
Reference in New Issue