diff --git a/ruby/db/20230106165534_user_match_email_sendings_default_sent_user_ids.rb b/ruby/db/20230106165534_user_match_email_sendings_default_sent_user_ids.rb
new file mode 100644
index 000000000..81ac90914
--- /dev/null
+++ b/ruby/db/20230106165534_user_match_email_sendings_default_sent_user_ids.rb
@@ -0,0 +1,11 @@
+ class UserMatchEmailSendingsDefaultSentUserIds < ActiveRecord::Migration
+ def self.up
+ execute("ALTER TABLE public.user_match_email_sendings
+ ALTER COLUMN sent_user_ids SET DEFAULT array[]::varchar[];")
+ end
+
+ def self.down
+ execute("ALTER TABLE public.user_match_email_sendings
+ ALTER COLUMN sent_user_ids DROP DEFAULT;")
+ end
+ end
diff --git a/ruby/db/migrate/20230104162300_create_user_match_email_sendings.rb b/ruby/db/migrate/20230104162300_create_user_match_email_sendings.rb
index 260ed35d9..8538253ba 100644
--- a/ruby/db/migrate/20230104162300_create_user_match_email_sendings.rb
+++ b/ruby/db/migrate/20230104162300_create_user_match_email_sendings.rb
@@ -3,7 +3,7 @@
execute(<<-SQL
CREATE TABLE public.user_match_email_sendings (
id character varying(64) DEFAULT public.uuid_generate_v4() PRIMARY KEY NOT NULL,
- sent_user_ids varchar[],
+ sent_user_ids text,
total_recipients integer,
created_at timestamp without time zone DEFAULT now() NOT NULL,
completed_at timestamp without time zone
diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb
index f86e97b48..28222b0c3 100755
--- a/ruby/lib/jam_ruby.rb
+++ b/ruby/lib/jam_ruby.rb
@@ -342,6 +342,7 @@ require "jam_ruby/models/mobile_recording_upload"
require "jam_ruby/models/temp_token"
require "jam_ruby/models/ad_campaign"
require "jam_ruby/models/user_asset"
+require "jam_ruby/models/user_match_email_sending"
include Jampb
diff --git a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb
index 793fd666e..61ec50f63 100644
--- a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb
+++ b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb
@@ -407,7 +407,7 @@ module JamRuby
mail(:to => user.email, :subject => EmailNewMusicianMatch.subject) do |format|
format.text
- format.html
+ format.html{ render layout: "user_mailer_beta" }
end
end
diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.html.erb
index 738788e76..627f56450 100644
--- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.html.erb
+++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.html.erb
@@ -1 +1,72 @@
-EMAIL BODY HERE: <%= @musicians_data.inspect -%>
\ No newline at end of file
+
+
+
+
+ Hi <%= @user.first_name -%>,
+
+ The following musicians have joined JamKazam within the last week and have low internet latency to you that will support enjoyable sessions. If you'd like to make more musical connections, we encourage you to use the links below to send these new users a welcome message and perhaps arrange a session to play together.
+ <% @musicians_data.each do | data | -%>
+ <%
+ musicians = data[:musicians]
+ latencies = data[:latencies]
+ musicians.each do |musician|
+ latency = latencies.find{|l| l[:user_id] == musician.id }
+ -%>
+
+
+ photo
+
+
+
<%= musician.first_name %> <%= musician.last_name %>
+
Latency To You: <%= latency[:ars_total_latency] %>
+
Last Active On:
+
+
+ <% musician.instruments.each do |instrument| -%>
+
+ <%= instrument.description %><%= instrument.inspect %>
+
+ <% end -%>
+
+
+
+ <% end -%>
+ <% end -%>
+
\ No newline at end of file
diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.text.erb
index 738788e76..2d06f81dd 100644
--- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.text.erb
+++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians_match.text.erb
@@ -1 +1 @@
-EMAIL BODY HERE: <%= @musicians_data.inspect -%>
\ No newline at end of file
+EMAIL BODY HERE: <%#= @musicians_data.inspect -%>
\ No newline at end of file
diff --git a/ruby/lib/jam_ruby/app/views/layouts/user_mailer_beta.html.erb b/ruby/lib/jam_ruby/app/views/layouts/user_mailer_beta.html.erb
new file mode 100644
index 000000000..a1df8a4b7
--- /dev/null
+++ b/ruby/lib/jam_ruby/app/views/layouts/user_mailer_beta.html.erb
@@ -0,0 +1,26 @@
+
+
+
+
+ JamKazam
+
+
+
+
+
+
+ <%= yield -%>
+
+
\ No newline at end of file
diff --git a/ruby/lib/jam_ruby/app/views/layouts/user_mailer_beta.text.erb b/ruby/lib/jam_ruby/app/views/layouts/user_mailer_beta.text.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/ruby/lib/jam_ruby/lib/email_new_musician_match.rb b/ruby/lib/jam_ruby/lib/email_new_musician_match.rb
index 7dc630ee9..1df6f738c 100644
--- a/ruby/lib/jam_ruby/lib/email_new_musician_match.rb
+++ b/ruby/lib/jam_ruby/lib/email_new_musician_match.rb
@@ -1,15 +1,18 @@
module JamRuby
class EmailNewMusicianMatch
-
+
PER_PAGE = 20
- JOINED_WITHIN_DAYS = ""
- ACTIVE_WITHIN_DAYS = ""
+ JOINED_WITHIN_DAYS = "7"
+ ACTIVE_WITHIN_DAYS = "7"
+ PRIORITY_RECIPIENTS = %w(seth@jamkazam.com david@jamkazam.com peter@jamkazam.com nuwan@jamkazam.com)
+
def self.subject
"New musicians with good Internet connections to you have joined JamKazam!"
end
def self.send_new_musicians
+
params = {
latency_good: true,
latency_fair: true,
@@ -24,38 +27,64 @@ module JamRuby
}
begin
-
- nextOffset = 0
email_sending = UserMatchEmailSending.most_recent
- if email_sending.completed?
+ if email_sending.nil? || email_sending.completed?
email_sending = UserMatchEmailSending.create
end
- recipients = User.where(subscribe_email: true, subscribe_email_for_user_match: true).where("users.id NOT IN ?", email_sending.sent_user_ids)
+ AdminMailer.ugly({to: APP_CONFIG.user_match_monitoring_email,
+ subject:"Weekly user match email sending started.",
+ body: "#{email_sending.sent_user_ids.any?? "Weekly email sending is resuming. It was originally started at #{email_sending.created_at} and has been sent to #{email_sending.sent_user_ids.size} user(s) so far." : "Weekly email sending was started at #{email_sending.created_at}" }"}).deliver_now
- #User.where(email: "nuwan@jamkazam.com").each do |user|
- recipients.order("updated_at DESC, last_join_session_at DESC").each do |user|
+ priority_recipients = User.where(email: PRIORITY_RECIPIENTS).where("users.subscribe_email = ? OR users.subscribe_email_for_user_match = ?", true, true)
+
+ user_recipients = User.where("users.subscribe_email = ? OR users.subscribe_email_for_user_match = ?", true, true).where.not(id: email_sending.sent_user_ids).order("updated_at DESC, last_jam_updated_at DESC")
+
+ recipients = (priority_recipients + user_recipients).uniq
+
+ recipients.each do |user|
+
ip = '127.0.0.1' #TODO: get this from user data?
matched_musician_data = []
+ nextOffset = 0
while !nextOffset.nil? && nextOffset >= 0 do
+
params.merge!({ offset: nextOffset })
- search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, ip, params)
- matched_musician_data << [search, latency_data] if search.results.size > 0
- end
+ results, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, ip, params)
+
+ matched_musician_data << [{ musicians: results, latencies: latency_data }] if results && results.size > 0
+ end
+ #debugger
if matched_musician_data.size > 0
+
UserMailer.new_musicians_match(user, matched_musician_data).deliver_now
+
user.update_column(:user_match_email_sent_at, Time.now)
email_sending.sent_user_ids.push(user.id)
email_sending.save!
end
end
+
email_sending.total_recipients = email_sending.sent_user_ids.size
email_sending.completed_at = Time.now
email_sending.save!
+
+ AdminMailer.ugly({
+ to: APP_CONFIG.user_match_monitoring_email,
+ subject:"Weekly user match email sending completed.",
+ body: "Weekly email sending job was completed at #{Time.now}. It was sent to #{email_sending.sent_user_ids.size} user(s)"
+ }).deliver_now
+
rescue => exception
- raise exception
+ begin
+ AdminMailer.ugly({to: APP_CONFIG.user_match_monitoring_email,
+ subject:"Error occured when sending weekly user match email.",
+ body: "An error was encountered at #{Time.now} while sending weekly user match email - #{exception.message}."}).deliver_now
+ rescue
+ Bugsnag.notify(exception)
+ end
end
end
diff --git a/ruby/lib/jam_ruby/lib/musician_filter.rb b/ruby/lib/jam_ruby/lib/musician_filter.rb
index 855ae62f3..db5a8d092 100644
--- a/ruby/lib/jam_ruby/lib/musician_filter.rb
+++ b/ruby/lib/jam_ruby/lib/musician_filter.rb
@@ -10,6 +10,7 @@ module JamRuby
};
def self.filter(user, remote_ip, params)
+ #debugger
latency_good = ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:latency_good])
latency_fair = ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:latency_fair])
latency_high = ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:latency_high])
diff --git a/ruby/lib/jam_ruby/models/user_match_email_sending.rb b/ruby/lib/jam_ruby/models/user_match_email_sending.rb
index 696d98146..c25a7bf32 100644
--- a/ruby/lib/jam_ruby/models/user_match_email_sending.rb
+++ b/ruby/lib/jam_ruby/models/user_match_email_sending.rb
@@ -1,5 +1,13 @@
module JamRuby
class UserMatchEmailSending < ActiveRecord::Base
+
+ serialize :sent_user_ids, Array
+
+ def sent_user_ids=(ids)
+ ids = ids.split(',') if ids.is_a?(String)
+ super(ids)
+ end
+
def completed?
!completed_at.nil?
end
diff --git a/ruby/spec/jam_ruby/lib/email_new_musician_match_spec.rb b/ruby/spec/jam_ruby/lib/email_new_musician_match_spec.rb
new file mode 100644
index 000000000..6ecd9dc65
--- /dev/null
+++ b/ruby/spec/jam_ruby/lib/email_new_musician_match_spec.rb
@@ -0,0 +1,81 @@
+require 'spec_helper'
+
+describe EmailNewMusicianMatch do
+ let(:user1) { FactoryGirl.create(:user) }
+ let(:user2) { FactoryGirl.create(:user) }
+ let(:user3) { FactoryGirl.create(:user) }
+ let(:user4) { FactoryGirl.create(:user) }
+ let(:user5) { FactoryGirl.create(:user) }
+ let(:user6) { FactoryGirl.create(:user) }
+ let(:user7) { FactoryGirl.create(:user, subscribe_email: false) }
+ let(:user8) { FactoryGirl.create(:user, subscribe_email: false, subscribe_email_for_user_match: false) }
+ let(:user9) { FactoryGirl.create(:user, email: 'seth@jamkazam.com') } #a priority user
+ let(:user10) { FactoryGirl.create(:user, email: 'david@jamkazam.com', subscribe_email: false) } #a priority user. but not included as he has marked not to receive email notifications
+
+ let(:search_result){ [[user1, user2, user3, user4, user5], [user6, user7, user8, user9, user10] ] }
+
+ let (:mail) { double("Mail") }
+ let (:admin_mail) { double("Admin Mail") }
+
+ before(:each) do
+ ActionMailer::Base.delivery_method = :test
+ ActionMailer::Base.perform_deliveries = true
+ ActionMailer::Base.deliveries = []
+ User.delete_all
+ allow(JamRuby::MusicianFilter).to receive(:filter).and_return(search_result)
+ end
+
+ after(:each) do
+ ActionMailer::Base.deliveries.clear
+ end
+
+ it "notify admin" do
+ allow(AdminMailer).to receive(:ugly).and_return(admin_mail)
+ expect(admin_mail).to receive(:deliver_now).exactly(2).times
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ end
+
+ it "does not sent to whom have not been opted to receive emails" do
+ ActionMailer::Base.deliveries.map{|d| d['to'].to_s }.include?("david@example.com").should be_falsey
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ end
+
+ it "delivers the new musicians notification email" do
+ allow(UserMailer).to receive(:new_musicians_match).and_return(mail)
+ expect(mail).to receive(:deliver_now).exactly(7).times
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ end
+
+ fit "delivers to priority recipients first" do
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ ActionMailer::Base.deliveries[1]['to'].to_s.should == "seth@jamkazam.com" #NOTE: the first email is sent to user_match_monitoring_email. The second email should be sent to the first priority user in the priority user list
+ end
+
+ describe "halfway done job" do
+ before(:each) do
+ UserMailer.deliveries.clear
+ allow_any_instance_of(UserMatchEmailSending).to receive(:sent_user_ids).and_return([user1.id, user2.id])
+ end
+
+ it "does not deliver to already delivered users" do
+ allow(UserMailer).to receive(:new_musicians_match).and_return(mail)
+ expect(mail).to receive(:deliver_now).exactly(5).times
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ end
+ end
+
+ describe "catching errors" do
+
+ before do
+ JamRuby::MusicianFilter.stub(:filter).and_raise
+ end
+
+ it 'notifies admin about the error' do
+ JamRuby::EmailNewMusicianMatch.send_new_musicians
+ ActionMailer::Base.deliveries.length.should == 2
+ ActionMailer::Base.deliveries[1]['subject'].to_s.should == "Error occured when sending weekly user match email."
+ end
+ end
+
+
+end
\ No newline at end of file
diff --git a/ruby/spec/jam_ruby/lib/musician_filter_spec.rb b/ruby/spec/jam_ruby/lib/musician_filter_spec.rb
new file mode 100644
index 000000000..2fd0386bf
--- /dev/null
+++ b/ruby/spec/jam_ruby/lib/musician_filter_spec.rb
@@ -0,0 +1,223 @@
+require 'spec_helper'
+require 'webmock/rspec'
+
+describe MusicianFilter do
+ let(:latency_data_uri) { /\S+\/search_users/ }
+ let(:user) { FactoryGirl.create(:user) }
+ let(:remote_ip) { "127.0.0.1" }
+
+ let(:user1) { FactoryGirl.create(:user) }
+ let(:user2) { FactoryGirl.create(:user) }
+ let(:user3) { FactoryGirl.create(:user) }
+ let(:user4) { FactoryGirl.create(:user) }
+ let(:user5) { FactoryGirl.create(:user) }
+ let(:user6) { FactoryGirl.create(:user) }
+ let(:user7) { FactoryGirl.create(:user) }
+ let(:user8) { FactoryGirl.create(:user) }
+
+ let(:response_body) { mock_latency_response([
+ { user: user1, ars_total_latency: 1.0, ars_internet_latency: 0.4, audio_latency: 0.6 }, #GOOD
+ { user: user2, ars_total_latency: 40.0, ars_internet_latency: 25.0, audio_latency: 15.0 }, #GOOD
+ { user: user3, ars_total_latency: 40.1, ars_internet_latency: 25, audio_latency: 15.1 }, #FAIR
+ { user: user4, ars_total_latency: 60.0, ars_internet_latency: 30, audio_latency: 30.0 }, #FAIR
+ { user: user5, ars_total_latency: 60.1, ars_internet_latency: 30.1, audio_latency: 30 }, #HIGH
+ { user: user6, ars_total_latency: 100.0, ars_internet_latency: 50.0, audio_latency: 50.0 }, #HIGH
+ { user: user7, ars_total_latency: -2, ars_internet_latency: -1, audio_latency: -1 }, #UNKNOWN
+ { user: user8, ars_total_latency: 10, ars_internet_latency: 5, audio_latency: 0 } #GOOD (NOTE: audio_latency from neo4j is 0 here)
+ ])
+ }
+
+ let(:response_body_pop) { mock_latency_response([
+ { user: user1, ars_total_latency: 1.0, ars_internet_latency: 0.4, audio_latency: 0.6 }, #GOOD
+ { user: user2, ars_total_latency: 40.0, ars_internet_latency: 25.0, audio_latency: 15.0 }, #GOOD
+ { user: user3, ars_total_latency: 40.1, ars_internet_latency: 25, audio_latency: 15.1 }, #FAIR
+ ])
+ }
+
+ let(:response_body_pop_and_rap) { mock_latency_response([
+ { user: user1, ars_total_latency: 1.0, ars_internet_latency: 0.4, audio_latency: 0.6 }, #GOOD
+ ])
+ }
+
+ let(:response_body_drums_intermediate) { mock_latency_response([
+ { user: user1, ars_total_latency: 1.0, ars_internet_latency: 0.4, audio_latency: 0.6 },
+ { user: user2, ars_total_latency: 40.0, ars_internet_latency: 25.0, audio_latency: 15.0 },
+ { user: user3, ars_total_latency: 40.1, ars_internet_latency: 25, audio_latency: 15.1 },
+ { user: user4, ars_total_latency: 60.0, ars_internet_latency: 30, audio_latency: 30.0 }
+ ])
+ }
+
+ let(:response_body_drums_violin_expert) { mock_latency_response([
+ { user: user2, ars_total_latency: 40.0, ars_internet_latency: 25.0, audio_latency: 15.0 },
+ { user: user3, ars_total_latency: 40.1, ars_internet_latency: 25, audio_latency: 15.1 },
+ ])
+ }
+
+ let(:response_body_active_within_one_day) { mock_latency_response([
+ { user: user4, ars_total_latency: 60.0, ars_internet_latency: 30, audio_latency: 30.0 }, #FAIR
+ ])
+ }
+
+ let(:response_body_joined_within_one_day) { mock_latency_response([
+ { user: user4, ars_total_latency: 60.0, ars_internet_latency: 30, audio_latency: 30.0 }, #FAIR
+ { user: user5, ars_total_latency: 60.1, ars_internet_latency: 30.1, audio_latency: 30 }, #HIGH
+ ])
+ }
+
+ before(:each) do
+ User.delete_all
+
+ stub_request(:post, latency_data_uri)
+ .with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'})
+ .to_return( body: response_body, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ genres: ["pop"]}),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_pop, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ genres: ["pop", "rap"]}),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_pop_and_rap, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ instruments: [{id: 'drums', proficiency: 2}]}),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_drums_intermediate, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ instruments: [{id: 'drums', proficiency: 3}, {id: 'violin', proficiency: 3}]}),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_drums_violin_expert, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ active_within_days: 1}),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_active_within_one_day, status: 200)
+
+ stub_request(:post, latency_data_uri).
+ with(
+ body: hash_including({ joined_within_days: 1 }),
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}
+ )
+ .to_return( body: response_body_joined_within_one_day, status: 200)
+ end
+
+ it "when no latency option is selected" do
+ opts = { latency_good: false, latency_fair: false, latency_high: false }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ puts search.results
+ puts "===="
+ puts latency_data
+ puts "===="
+ puts nextOffset
+ expect(search.results.size).to eq(8)
+ expect(latency_data).not_to eq(nil)
+ expect(latency_data[0][:audio_latency]).not_to eq(nil)
+ expect(latency_data[0][:ars_total_latency]).not_to eq(nil)
+ expect(latency_data[0][:ars_internet_latency]).not_to eq(nil)
+ end
+
+ it "filter musicians for all latency options" do
+ opts = { latency_good: true, latency_fair: true, latency_high: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+
+ expect(search.results.size).to eq(7)
+ expect(latency_data).not_to eq(nil)
+ expect(latency_data[0][:audio_latency]).not_to eq(nil)
+ expect(latency_data[0][:ars_total_latency]).not_to eq(nil)
+ expect(latency_data[0][:ars_internet_latency]).not_to eq(nil)
+
+ #sort by latency
+ expect(search.results[0][:id]).to eq(user1.id)
+ expect(search.results[1][:id]).to eq(user2.id)
+ expect(search.results[2][:id]).to eq(user3.id)
+ expect(search.results[3][:id]).to eq(user4.id)
+ expect(search.results[4][:id]).to eq(user5.id)
+ expect(search.results[5][:id]).to eq(user6.id)
+ expect(search.results[6][:id]).to eq(user8.id)
+
+ end
+
+ it "filter GOOD latency users" do
+ opts = { latency_good: true, latency_fair: false, latency_high: false }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(3)
+ end
+
+
+ it "filter FAIR latency musicians" do
+ opts = { latency_good: false, latency_fair: true, latency_high: false }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(2)
+ end
+
+ it "filter HIGH latency musicians" do
+ opts = { latency_good: false, latency_fair: false, latency_high: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(2)
+ end
+
+ it "filter GOOD and FAIR latency musicians" do
+ opts = { latency_good: true, latency_fair: true, latency_high: false }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(5)
+ end
+
+ it "filter GOOD and HIGH latency musicians" do
+ opts = { latency_good: true, latency_fair: false, latency_high: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(5)
+ end
+
+ it "filter GOOD, FAIR and HIGH latency musicians" do
+ opts = { latency_good: true, latency_fair: true, latency_high: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(7)
+ end
+
+ it "filter musicians by genres" do
+ opts = { latency_good: true, latency_fair: true, latency_high: true, genres: ['pop'] }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(3)
+
+ opts = { latency_good: true, latency_fair: true, latency_high: true, genres: ['pop', 'rap'] }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(1)
+ end
+
+ it "filter musicians by instruments they play" do
+
+ opts = { latency_good: true, latency_fair: true, latency_high: true, instruments: [{value: "drums", label: "Drums"}], proficiency_intermediate: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(4)
+
+ opts = { latency_good: true, latency_fair: true, latency_high: true, instruments: [{value: "drums", label: "Drums"}, {value: 'violin', label: 'Violin'}], proficiency_expert: true }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(2)
+ end
+
+ it "filter musicians by days ago that they joined" do
+ opts = { latency_good: true, latency_fair: true, latency_high: true, joined_within_days: 1 }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(2)
+ end
+
+ it "finds user updated_at is within a day ago" do
+ opts = { latency_good: true, latency_fair: true, latency_high: true, active_within_days: 1 }
+ search, latency_data, nextOffset = JamRuby::MusicianFilter.filter(user, remote_ip, opts)
+ expect(search.results.size).to eq(1)
+ end
+
+end
\ No newline at end of file
diff --git a/ruby/spec/mailers/render_emails_spec.rb b/ruby/spec/mailers/render_emails_spec.rb
index a50ca4792..acc052fd5 100644
--- a/ruby/spec/mailers/render_emails_spec.rb
+++ b/ruby/spec/mailers/render_emails_spec.rb
@@ -523,6 +523,35 @@ describe "RenderMailers" do
@filename="daily_sessions"; scheduled_batch.deliver_batch
end
end
+
+ describe "New Musician Match email" do
+ let(:user) { FactoryGirl.create(:user) }
+ let(:user1) { FactoryGirl.create(:user) }
+ let(:user2) { FactoryGirl.create(:user) }
+ let(:matched_musician_data){
+ [
+ {
+ musicians: [user1, user2],
+ latencies: [
+ {:user_id=> user1.id, :audio_latency=>4, :ars_total_latency=>12, :ars_internet_latency=>8},
+ {:user_id=> user2.id, :audio_latency=>4, :ars_total_latency=>12, :ars_internet_latency=>8}
+ ]
+ }
+ ]
+ }
+
+ before(:each) do
+ ActionMailer::Base.deliveries.clear
+ end
+
+ after(:each) do
+ ActionMailer::Base.deliveries.length.should == 1
+ mail = ActionMailer::Base.deliveries[0]
+ save_emails_to_disk(mail, @filename)
+ end
+
+ fit { @filename="new_musicians_match"; UserMailer.new_musicians_match(user, matched_musician_data).deliver_now }
+ end
end
def save_emails_to_disk(mail, filename)
diff --git a/ruby/spec/mailers/user_mailer_spec.rb b/ruby/spec/mailers/user_mailer_spec.rb
index 0ead1a9fe..14b03edfd 100644
--- a/ruby/spec/mailers/user_mailer_spec.rb
+++ b/ruby/spec/mailers/user_mailer_spec.rb
@@ -26,7 +26,6 @@ describe UserMailer do
UserMailer.confirm_email(user, signup_confirmation_url_with_token).deliver_now
end
-
it { UserMailer.deliveries.length.should == 1 }
it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
it { mail['to'].to_s.should == user.email }
diff --git a/web/app/controllers/api_search_controller.rb b/web/app/controllers/api_search_controller.rb
index 59fa3f8bb..a09e21076 100644
--- a/web/app/controllers/api_search_controller.rb
+++ b/web/app/controllers/api_search_controller.rb
@@ -181,6 +181,8 @@ class ApiSearchController < ApiController
def filter
begin
@search, @latency_data, @nextOffset = JamRuby::MusicianFilter.filter(current_user, request.remote_ip, params)
+ Rails.logger.debug("=====SEARCH : #{@search.results.inspect}")
+ Rails.logger.debug("=====LATENCY : #{@latency_data}")
respond_with @search, responder: ApiResponder, status: 201, template: 'api_search/filter'
rescue
render json: {}, status: 500
diff --git a/web/config/application.rb b/web/config/application.rb
index b3361beea..a8f1caa6a 100644
--- a/web/config/application.rb
+++ b/web/config/application.rb
@@ -516,6 +516,6 @@ if defined?(Bundler)
config.latency_data_host_auth_code = "c2VydmVyOnBhc3N3b3Jk"
config.manual_override_installer_ends_with = "JamKazam-1.0.3776.dmg"
config.spa_origin = "http://beta.jamkazam.local:3000"
-
+ config.user_match_monitoring_email = "user_match_monitoring_email@jamkazam.com"
end
end
diff --git a/web/spec/requests/musician_filter_api_spec.rb b/web/spec/requests/musician_filter_api_spec.rb
index 23abf48f2..c25b823ef 100644
--- a/web/spec/requests/musician_filter_api_spec.rb
+++ b/web/spec/requests/musician_filter_api_spec.rb
@@ -133,7 +133,7 @@ describe "Musician Filter API", type: :request do
expect(JSON.parse(response.body)["musicians"].size).to eq(8)
end
- it "filter musicians when no latency option is selected", focus: true do
+ it "filter musicians when no latency option is selected" do
post '/api/filter.json', { latency_good: false, latency_fair: false, latency_high: false }
expect(JSON.parse(response.body)["musicians"].size).to eq(8)
expect(JSON.parse(response.body)["musicians"][0]["latency_data"]).not_to eq(nil)
@@ -222,7 +222,7 @@ describe "Musician Filter API", type: :request do
expect(JSON.parse(response.body)["musicians"].size).to eq(2)
end
- it "filter musicians by days ago that they joined" do
+ fit "filter musicians by days ago that they joined" do
post '/api/filter.json', { latency_good: true, latency_fair: true, latency_high: true, joined_within_days: 1 }
expect(JSON.parse(response.body)["musicians"].size).to eq(2)
end