* VRFS-1962, VRFS-2047, VRFS-2046, VRFS-2006 - score breakdown hover and score badges are all tested and working

This commit is contained in:
Seth Call 2014-08-19 20:58:24 -05:00
parent e3406e7af0
commit 554d100c31
18 changed files with 295 additions and 197 deletions

View File

@ -74,7 +74,7 @@
<td style="text-align:center">
<span class="latency">
<span class="latency-value"><%= (sess.latency / 2).round %> ms</span>
<% if sess.latency <= (APP_CONFIG.max_good_full_score * 2) %>
<% if sess.latency <= (APP_CONFIG.max_good_full_score) %>
<%= image_tag("http://www.jamkazam.com/assets/content/icon_green_score.png", alt: 'good score icon') %>
<% else %>
<%= image_tag("http://www.jamkazam.com/assets/content/icon_yellow_score.png", alt: 'fair score icon') %>

View File

@ -225,8 +225,8 @@ module JamRuby
rel = rel.where(['current_scores.full_score > ?', score_min]) unless score_min.nil?
rel = rel.where(['current_scores.full_score <= ?', score_max]) unless score_max.nil?
rel = rel.select('current_scores.full_score, current_scores.score, round(current_scores.a_audio_latency) as audio_latency, regions.regionname')
rel = rel.group('current_scores.full_score, current_scores.score, current_scores.a_audio_latency, regions.regionname')
rel = rel.select('current_scores.full_score, current_scores.score, regions.regionname')
rel = rel.group('current_scores.full_score, current_scores.score, regions.regionname')
end
ordering = self.order_param(params)

View File

@ -111,15 +111,15 @@ def app_config
end
def max_good_full_score
20
40
end
def max_yellow_full_score
35
70
end
def max_red_full_score
50
100
end
private

View File

@ -138,14 +138,18 @@
.done(function(rsvpResponse) {
rsvpData = rsvpResponse;
renderSession();
app.user()
.done(function(userMe) {
renderSession(userMe);
})
})
.fail(app.ajaxError);
})
.fail(app.ajaxError);
}
function renderSession() {
function renderSession(userMe) {
var hasPending = false;
var isOwner = false;
if (sessionData.user_id == context.JK.currentUserId) {
@ -211,12 +215,9 @@
var audio_latency = $latencyBadge.attr('data-audio-latency') || null;
var latencyBadgeUserId = $latencyBadge.attr('data-user-id');
var scoreOptions = {offsetParent: $offsetParent};
app.user()
.done(function(userMe) {
helpBubble.scoreBreakdown($latencyBadge, context.JK.currentUserId == latencyBadgeUserId, full_score, userMe.last_jam_audio_latency, audio_latency, internet_score, scoreOptions);
})
});
helpBubble.scoreBreakdown($latencyBadge, context.JK.currentUserId == latencyBadgeUserId, full_score, userMe.last_jam_audio_latency, audio_latency, internet_score, scoreOptions);
});
$sessionDetail.html($template);

View File

@ -14,6 +14,7 @@
var textMessageDialog = null;
var $results = null;
var helpBubble = context.JK.HelpBubbleHelper;
var sessionUtils = context.JK.SessionUtils;
function loadMusicians(queryString) {
// squelch nulls and undefines
@ -86,23 +87,6 @@
return Math.round(score / 2) + " ms";
}
function score_to_color(score) {
// these are raw scores as reported by client (round trip times)
if (score == null) return "purple";
if (0 < score && score <= 40) return "green";
if (40 < score && score <= 70) return "yellow";
if (70 < score && score <= 100) return "red";
return "blue";
}
function score_to_color_alt(score) {
// these are raw scores as reported by client (round trip times)
if (score == null) return "missing";
if (0 < score && score <= 40) return "good";
if (40 < score && score <= 70) return "moderate";
if (70 < score && score <= 100) return "poor";
return "unacceptable";
}
function formatLocation(musician) {
if(musician.city && musician.state) {
@ -168,6 +152,8 @@
var musician_actions = context.JK.fillTemplate(aTemplate, actionVals);
var full_score = musician['full_score'];
var scoreInfo = sessionUtils.scoreInfo(full_score, false)
mVals = {
avatar_url: context.JK.resolveAvatarUrl(musician.photo_url),
profile_url: "/client#/profile/" + musician.id,
@ -183,9 +169,9 @@
musician_follow_template: follows,
musician_action_template: musician_actions,
musician_one_way_score: score_to_text(full_score),
musician_score_color: score_to_color(full_score),
musician_score_color_alt: score_to_color_alt(full_score)
musician_score_color: scoreInfo.icon_name,
musician_score_color_alt: scoreInfo.description,
latency_style: scoreInfo.latency_style
};
var $rendering = $(context.JK.fillTemplate(mTemplate, mVals))

View File

@ -12,7 +12,8 @@
var logger = context.JK.logger;
var LATENCY = {
var LATENCY = sessionUtils.LATENCY = {
ME : {description: "ME", style: "latency-me", min: -1, max: -1},
GOOD : {description: "GOOD", style: "latency-good", min: 0.0, max: 40.0},
MEDIUM : {description: "FAIR", style: "latency-fair", min: 40.0, max: 70.0},
@ -62,44 +63,58 @@
}
}
sessionUtils.createLatency = function(user) {
var latencyStyle;
sessionUtils.scoreInfo = function(full_score, isSameUser) {
var latencyDescription;
var latencyStyle;
var iconName;
var description;
if (user.id === context.JK.currentUserId) {
latencyStyle = LATENCY.ME.style, latencyDescription = LATENCY.ME.description;
if(isSameUser) {
latencyDescription = LATENCY.ME.description;
latencyStyle = LATENCY.ME.style;
iconName = 'purple';
description = 'me';
}
else if (!full_score) {
latencyDescription = LATENCY.UNKNOWN.description;
latencyStyle = LATENCY.UNKNOWN.style;
iconName = 'purple'
description = 'missing'
}
else if (full_score <= LATENCY.GOOD.max) {
latencyDescription = LATENCY.GOOD.description;
latencyStyle = LATENCY.GOOD.style;
iconName = 'green'
description = 'good'
}
else if (full_score <= LATENCY.MEDIUM.max) {
latencyDescription = LATENCY.MEDIUM.description;
latencyStyle = LATENCY.MEDIUM.style;
iconName = 'yellow';
description = 'fair'
}
else if (full_score <= LATENCY.POOR.max) {
latencyDescription = LATENCY.POOR.description;
latencyStyle = LATENCY.POOR.style;
iconName = 'red'
description = 'poor'
}
else {
var latency = user.full_score;
if (!latency) {
latencyDescription = LATENCY.UNKNOWN.description;
latencyStyle = LATENCY.UNKNOWN.style;
}
else if (latency <= LATENCY.GOOD.max) {
latencyDescription = LATENCY.GOOD.description;
latencyStyle = LATENCY.GOOD.style;
}
else if (latency > LATENCY.MEDIUM.min && latency <= LATENCY.MEDIUM.max) {
latencyDescription = LATENCY.MEDIUM.description;
latencyStyle = LATENCY.MEDIUM.style;
}
else if (latency > LATENCY.POOR.min && latency <= LATENCY.POOR.max) {
latencyDescription = LATENCY.POOR.description;
latencyStyle = LATENCY.POOR.style;
}
else {
latencyStyle = LATENCY.UNACCEPTABLE.style
latencyDescription = LATENCY.UNACCEPTABLE.description
}
latencyStyle = LATENCY.UNACCEPTABLE.style;
latencyDescription = LATENCY.UNACCEPTABLE.description;
iconName = 'blue'
description = 'unacceptable'
}
return {
latency_style: latencyStyle,
latency_text: latencyDescription
latency_text: latencyDescription,
icon_name: iconName,
description: description
};
}
sessionUtils.createLatency = function(user) {
return sessionUtils.scoreInfo(user.full_score, user.id === context.JK.currentUserId)
}
})(window, jQuery);

View File

@ -1,6 +1,71 @@
@import "client/common";
table.findsession-table, table.local-recordings, #account-session-detail {
.latency-unacceptable {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeUnacceptable;
text-align:center;
}
.latency-unknown {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeUnacceptable;
text-align:center;
}
.latency-good {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeGood;
text-align:center;
}
.latency-me {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
text-align:center;
background-color:$latencyBadgeMe;
color:black;
}
.latency-fair {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeFair;
text-align:center;
}
.latency-poor{
width: 40px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgePoor;
text-align:center;
}
}
table.findsession-table, table.local-recordings {
width:98%;
height:10%;
@ -81,67 +146,6 @@ table.findsession-table, table.local-recordings {
}
.latency-unacceptable {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeUnacceptable;
text-align:center;
}
.latency-unknown {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeUnacceptable;
text-align:center;
}
.latency-good {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeGood;
text-align:center;
}
.latency-me {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
text-align:center;
background-color:$latencyBadgeMe;
color:black;
}
.latency-fair {
width: 50px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgeFair;
text-align:center;
}
.latency-poor{
width: 40px;
height: 10px;
font-family:Arial, Helvetica, sans-serif;
font-weight:200;
font-size:11px;
background-color:$latencyBadgePoor;
text-align:center;
}
.avatar-tiny {
float:left;
padding:1px;

View File

@ -47,7 +47,7 @@ if @search.musicians_filter_search?
end
child(:results => :musicians) {
attributes :id, :first_name, :last_name, :name, :city, :state, :country, :email, :online, :musician, :photo_url, :biography, :regionname, :score, :full_score, :audio_latency
attributes :id, :first_name, :last_name, :name, :city, :state, :country, :email, :online, :musician, :photo_url, :biography, :regionname, :score, :full_score
node :is_friend do |musician|
@search.is_friend?(musician)
@ -79,6 +79,10 @@ if @search.musicians_filter_search?
node :friend_count do |musician| @search.friend_count(musician) end
node :recording_count do |musician| @search.record_count(musician) end
node :session_count do |musician| @search.session_count(musician) end
node :audio_latency do |musician|
last_jam_audio_latency(musician)
end
}
end

View File

@ -62,9 +62,9 @@
<div class="help-musician-score-count">
<p>The score shown is the one-way latency (or delay) in milliseconds from you to this user. This score is calculated using the following three values that JamKazam gathers:</p>
<ul>
<li><span class="definition">Your Audio Gear Latency:</span> <span class="measurement my-gear-latency"><span class="measurement-value">{{data.my_gear_latency ? data.my_gear_latency + ' ms': '13 ms*'}}</span> <span class="measurement-absent">{{data.my_gear_latency ? '' : "(you have not qualified any gear, so we picked an average gear latency)"}}</span></span></li>
<li><span class="definition">Their Audio Gear Latency:</span> <span class="measurement their-gear-latency"><span class="measurement-value">{{data.their_gear_latency ? data.their_gear_latency + ' ms': '13 ms*'}}</span> <span class="measurement-absent">{{data.their_gear_latency ? '' : "(they have not qualified any gear, so we picked an average gear latency)"}}</span></span></li>
<li><span class="definition">Round-trip Internet Latency:</span> <span class="measurement internet-latency"><span class="measurement-value">{{data.internet_latency ? data.internet_latency + ' ms': '?'}}</span> <span class="measurement-absent">{{data.internet_latency ? '' : "(we have not scored you with this user yet)"}}</span></span></li>
<li><span class="definition">Your Audio Gear Latency:</span> <span class="measurement my-gear-latency partial"><span class="measurement-value">{{data.my_gear_latency ? data.my_gear_latency + ' ms': '13 ms*'}}</span> <span class="measurement-absent">{{data.my_gear_latency ? '' : "(you have not qualified any gear, so we picked an average gear latency)"}}</span></span></li>
<li><span class="definition">Their Audio Gear Latency:</span> <span class="measurement their-gear-latency partial"><span class="measurement-value">{{data.their_gear_latency ? data.their_gear_latency + ' ms': '13 ms*'}}</span> <span class="measurement-absent">{{data.their_gear_latency ? '' : "(they have not qualified any gear, so we picked an average gear latency)"}}</span></span></li>
<li><span class="definition">Round-trip Internet Latency:</span> <span class="measurement internet-latency partial"><span class="measurement-value">{{data.internet_latency ? data.internet_latency + ' ms': '?'}}</span> <span class="measurement-absent">{{data.internet_latency ? '' : "(we have not scored you with this user yet)"}}</span></span></li>
</ul>
<p> <span class="definition">Total One-Way Latency:</span> <span class="measurement my-gear-latency"><span class="measurement-value">( {{data.my_gear_latency ? data.my_gear_latency: '13'}} + {{data.their_gear_latency ? data.their_gear_latency: '13'}} + {{data.internet_latency ? data.internet_latency: '?'}} ) / 2 = {{data.full_score ? data.full_score + ' ms' : "?"}}</span> <span class="measurement-absent">{{data.full_score ? '' : "(when we don't know internet latency, we don't try to guess your one-way latency)"}}</span></span>

View File

@ -24,7 +24,7 @@
<!-- Session Row Template -->
<script type="text/template" id="template-find-musician-row">
<div class="profile-band-list-result musician-list-result">
<div class="profile-band-list-result musician-list-result" data-musician-id={musician_id}>
<div class="f11" data-hint="container">
<div class="left" style="width:63px;margin-top:-12px;">
<!-- avatar -->
@ -53,7 +53,7 @@
<span class="follower-count">{follow_count} <img src="../assets/content/icon_followers.png" alt="follows" width="22" height="12" align="absmiddle" style="margin-right:4px;"/></span>
<span class="recording-count">{recording_count} <img src="../assets/content/icon_recordings.png" alt="recordings" width="12" height="13" align="absmiddle" style="margin-right:4px;"/></span>
<span class="session-count">{session_count} <img src="../assets/content/icon_session_tiny.png" alt="sessions" width="12" height="12" align="absmiddle" style="margin-right:4px;"/></span>
<span class="score-count">{musician_one_way_score} <img src="../assets/content/icon_{musician_score_color}_score.png" alt="{musician_score_color_alt} score" width="12" height="12" align="absmiddle" style="margin-right:4px;"/></span>
<span class="score-count {latency_style}">{musician_one_way_score} <img src="../assets/content/icon_{musician_score_color}_score.png" alt="{musician_score_color_alt} score" width="12" height="12" align="absmiddle" style="margin-right:4px;"/></span>
</div>
<div class="result-list-button-wrapper" data-musician-id={musician_id}>
{musician_action_template}

View File

@ -257,9 +257,9 @@ if defined?(Bundler)
config.max_track_part_upload_failures = 3
# scoring thresholds for 'full score', which is 1/2 your gear + 1/2 their gear + and 1/2 ping time
config.max_good_full_score = 20
config.max_yellow_full_score = 35
config.max_red_full_score = 50
config.max_good_full_score = 40
config.max_yellow_full_score = 70
config.max_red_full_score = 100
end
end

View File

@ -7,7 +7,6 @@ describe "Find Session", :js => true, :type => :feature, :capybara_feature => tr
let(:austin) { austin_geoip }
let(:dallas) { dallas_geoip }
let(:user) { FactoryGirl.create(:user, last_jam_locidispid: austin_geoip[:locidispid], last_jam_addr: austin_ip) }
let(:finder) { FactoryGirl.create(:user, last_jam_locidispid: dallas_geoip[:locidispid], last_jam_addr: dallas_ip) }
@ -70,33 +69,30 @@ describe "Find Session", :js => true, :type => :feature, :capybara_feature => tr
it "shows latency information correctly" do
# this will try to show all 6 latency badges. unknown, good, fair, poor, unacceptable, and me
user.last_jam_locidispid = austin[:locidispid]
user.save!
verify_score(nil, '#sessions-active', user, session1_creator)
verify_score(3, '#sessions-active', user, session1_creator)
verify_score(40, '#sessions-active', user, session1_creator)
verify_score(80, '#sessions-active', user, session1_creator)
verify_score(110, '#sessions-active', user, session1_creator)
verify_find_session_score(nil, '#sessions-active', user, session1_creator)
verify_find_session_score(3, '#sessions-active', user, session1_creator)
verify_find_session_score(40, '#sessions-active', user, session1_creator)
verify_find_session_score(80, '#sessions-active', user, session1_creator)
verify_find_session_score(110, '#sessions-active', user, session1_creator)
fast_signout
fast_signin(session1_creator, "/client#/findSession")
verify_score(nil, '#sessions-active', session1_creator, session1_creator)
verify_find_session_score(nil, '#sessions-active', session1_creator, session1_creator)
# this should cause it to move to the scheduled session view; we'll check all the values again
ActiveMusicSession.delete_all
verify_score(nil, '#sessions-scheduled', session1_creator, session1_creator)
verify_find_session_score(nil, '#sessions-scheduled', session1_creator, session1_creator)
fast_signout
fast_signin(user, "/client#/findSession")
verify_score(nil, '#sessions-scheduled', user, session1_creator)
verify_score(3, '#sessions-scheduled', user, session1_creator)
verify_score(40, '#sessions-scheduled', user, session1_creator)
verify_score(80, '#sessions-scheduled', user, session1_creator)
verify_score(110, '#sessions-scheduled', user, session1_creator)
verify_find_session_score(nil, '#sessions-scheduled', user, session1_creator)
verify_find_session_score(3, '#sessions-scheduled', user, session1_creator)
verify_find_session_score(40, '#sessions-scheduled', user, session1_creator)
verify_find_session_score(80, '#sessions-scheduled', user, session1_creator)
verify_find_session_score(110, '#sessions-scheduled', user, session1_creator)
end
end

View File

@ -4,19 +4,19 @@ describe "Musician Search", :js => true, :type => :feature, :capybara_feature =>
subject { page }
before(:all) do
poltergeist_setup
end
let(:austin) { austin_geoip }
let(:dallas) { dallas_geoip }
let(:user) {FactoryGirl.create(:user, last_jam_locidispid: austin_geoip[:locidispid], last_jam_addr: austin_ip)}
let(:user2) {FactoryGirl.create(:user, last_jam_locidispid: dallas_geoip[:locidispid], last_jam_addr: dallas_ip)}
before(:each) do
@user = FactoryGirl.create(:user, last_jam_locidispid: 1)
@user2 = FactoryGirl.create(:user, last_jam_locidispid: 1)
MaxMindManager.create_phony_database
Score.delete_all
Score.createx(1, 'a', 1, 1, 'a', 1, 10)
Score.createx(austin_geoip[:locidispid], 'a', 1, dallas_geoip[:locidispid], 'a', 1, 10)
ActiveRecord::Base.logger.debug '====================================== begin ======================================'
sign_in_poltergeist @user
sign_in_poltergeist user
visit "/client#/musicians"
end
@ -47,4 +47,15 @@ describe "Musician Search", :js => true, :type => :feature, :capybara_feature =>
expect(page).to_not have_selector('#musician-filter-results .musician-list-result')
end
it "shows latency information correctly" do
# this will try to show 5 latency badges. unknown, good, fair, poor, unacceptable. 'me' does not happen on this screen
user.last_jam_locidispid = austin[:locidispid]
user.save!
verify_find_musician_score(nil, user, user2)
verify_find_musician_score(3, user, user2)
verify_find_musician_score(40, user, user2)
verify_find_musician_score(80, user, user2)
verify_find_musician_score(110, user, user2)
end
end

View File

@ -3,7 +3,9 @@ require 'spec_helper'
describe "Session Detail", :js => true, :type => :feature, :capybara_feature => true do
let(:searcher) { FactoryGirl.create(:user) }
let(:austin) { austin_geoip }
let(:dallas) { dallas_geoip }
let(:searcher) { FactoryGirl.create(:user, last_jam_locidispid: austin_geoip[:locidispid], last_jam_addr: austin_ip) }
let(:requested_rsvp_slot) {FactoryGirl.create(:requested_rsvp_slot, user: searcher)}
before(:each) do
@ -64,4 +66,24 @@ describe "Session Detail", :js => true, :type => :feature, :capybara_feature =>
find('a#btnCancelRsvp').trigger(:click)
should_not have_selector('td', text: searcher.name)
end
it "shows latency information correctly" do
# this will try to show all 6 latency badges. unknown, good, fair, poor, unacceptable, and me
session_creator = requested_rsvp_slot.music_session.creator
session_creator.last_jam_locidispid = dallas_geoip[:locidispid]
session_creator.last_jam_addr = dallas_ip
session_creator.save!
fast_signin(session_creator, Nav.session_detail(requested_rsvp_slot.music_session))
find('h2', text: 'RSVPs')
target_path = Nav.session_detail(requested_rsvp_slot.music_session)
verify_session_detail_score(nil, session_creator, searcher, target_path)
verify_session_detail_score(nil, session_creator, session_creator, target_path)
verify_session_detail_score(3, session_creator, searcher, target_path)
verify_session_detail_score(40, session_creator, searcher, target_path)
verify_session_detail_score(80, session_creator, searcher, target_path)
verify_session_detail_score(110, session_creator, searcher, target_path)
end
end

View File

@ -2,6 +2,10 @@ require 'spec_helper'
describe "Session Info", :js => true, :type => :feature, :capybara_feature => true do
let(:austin) { austin_geoip }
let(:dallas) { dallas_geoip }
before(:each) do
SessionInfoComment.delete_all
Notification.delete_all
@ -11,20 +15,21 @@ describe "Session Info", :js => true, :type => :feature, :capybara_feature => tr
Invitation.delete_all
MusicSession.delete_all
User.delete_all
MaxMindManager.create_phony_database
@rsvp_approved_user = FactoryGirl.create(:user)
@rsvp_approved_user = FactoryGirl.create(:user, last_jam_locidispid: dallas_geoip[:locidispid], last_jam_addr: dallas_ip)
@rsvp_approved_user.save
@rsvp_declined_user = FactoryGirl.create(:user)
@rsvp_declined_user = FactoryGirl.create(:user, last_jam_locidispid: dallas_geoip[:locidispid], last_jam_addr: dallas_ip)
@rsvp_declined_user.save
@session_invitee = FactoryGirl.create(:user)
@session_invitee = FactoryGirl.create(:user, last_jam_locidispid: dallas_geoip[:locidispid], last_jam_addr: dallas_ip)
@session_invitee.save
@non_session_invitee = FactoryGirl.create(:user)
@non_session_invitee = FactoryGirl.create(:user, ;)
@non_session_invitee.save
@session_creator = FactoryGirl.create(:user)
@session_creator = FactoryGirl.create(:user, last_jam_locidispid: austin_geoip[:locidispid], last_jam_addr: austin_ip)
@session_creator.save
# session invitations require sender and receiver to be friends
@ -42,19 +47,13 @@ describe "Session Info", :js => true, :type => :feature, :capybara_feature => tr
@url = "/sessions/#{@music_session.id}/details"
@slot1 = FactoryGirl.create(:rsvp_slot, :music_session => @music_session, :instrument => JamRuby::Instrument.find('electric guitar'))
@slot2 = FactoryGirl.create(:rsvp_slot, :music_session => @music_session, :instrument => JamRuby::Instrument.find('drums'))
@invitation = FactoryGirl.create(:invitation, :sender => @session_creator, :receiver => @session_invitee, :music_session => @music_session)
@invitation = FactoryGirl.create(:invitation, :sender => @session_creator, :receiver => @rsvp_approved_user, :music_session => @music_session)
@invitation = FactoryGirl.create(:invitation, :sender => @session_creator, :receiver => @rsvp_declined_user, :music_session => @music_session)
# create RSVP request 1
@rsvp1 = RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id], :message => "Let's Jam!"}, @rsvp_approved_user)
# create RSVP request 2
@rsvp2 = RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id], :message => "Let's Jam!"}, @rsvp_declined_user)
# approve slot1
@ -205,6 +204,18 @@ describe "Session Info", :js => true, :type => :feature, :capybara_feature => tr
fast_signout
end
it "shows latency information correctly" do
# this will try to show all 6 latency badges. unknown, good, fair, poor, unacceptable, and me
fast_signin(@session_creator, @url)
verify_session_info_score(nil, @session_creator, @session_creator)
verify_session_info_score(nil, @session_creator, @rsvp_approved_user)
verify_session_info_score(3, @session_creator, @rsvp_approved_user)
verify_session_info_score(40, @session_creator, @rsvp_approved_user)
verify_session_info_score(80, @session_creator, @rsvp_approved_user)
verify_session_info_score(110, @session_creator, @rsvp_approved_user)
end
# musician_access = true, approval_required = false
it "should allow anyone to view for 'at will' option after session starts" do
@music_session.musician_access = true

View File

@ -60,15 +60,15 @@ def web_config
end
def max_good_full_score
20
40
end
def max_yellow_full_score
35
70
end
def max_red_full_score
50
100
end
end
klass.new

View File

@ -202,46 +202,99 @@ def locidispid_from_ip(ip_address)
end
end
def expected_score_info(score, parent_selector, current_user, target_user)
def expected_score_info(score, current_user, target_user)
full_score = score ? score + current_user.last_jam_audio_latency + target_user.last_jam_audio_latency : nil
if current_user == target_user
expected = {latency_badge_selector: '.latency-me', latency_badge_text: 'ME'}
expected = {latency_badge_selector: '.latency-me', latency_badge_text: 'ME', color: nil}
elsif full_score == nil
expected = {latency_badge_selector: '.latency-unknown', latency_badge_text: 'UNKNOWN'}
expected = {latency_badge_selector: '.latency-unknown', latency_badge_text: 'UNKNOWN', color: 'purple'}
elsif full_score < 40
expected = {latency_badge_selector: '.latency-good', latency_badge_text: 'GOOD'}
expected = {latency_badge_selector: '.latency-good', latency_badge_text: 'GOOD', color: 'green'}
elsif full_score < 70
expected = {latency_badge_selector: '.latency-fair', latency_badge_text: 'FAIR'}
expected = {latency_badge_selector: '.latency-fair', latency_badge_text: 'FAIR', color: 'yellow'}
elsif full_score < 100
expected = {latency_badge_selector: '.latency-poor', latency_badge_text: 'POOR'}
expected = {latency_badge_selector: '.latency-poor', latency_badge_text: 'POOR', color: 'red'}
else
expected = {latency_badge_selector: '.latency-unacceptable', latency_badge_text: 'UNACCEPTABLE'}
expected = {latency_badge_selector: '.latency-unacceptable', latency_badge_text: 'UNACCEPTABLE', color: 'blue'}
end
expected
end
# will verify that the score shown match the score desired
def verify_score(score, parent_selector, current_user, target_user)
expected = expected_score_info(score, parent_selector, current_user, target_user)
# will verify that the score shown match the score desired
def verify_find_session_score(score, parent_selector, current_user, target_user)
expected = expected_score_info(score, current_user, target_user)
Score.connection.execute('DELETE FROM scores').check
if score
create_score(austin, dallas, { auserid: user.id, buserid: session1_creator.id},
create_score(austin, dallas, { auserid: current_user.id, buserid: target_user.id},
austin[:jamisp].beginip, dallas[:jamisp].beginip, 'a_client_id', 'b_client_id', score=score) # creates scores with very recent created_at, so it should be skipped
end
find('#btn-refresh').trigger(:click)
page.assert_selector("div#{parent_selector} .found-session", count: 1)
find(".latency-value#{expected[:latency_badge_selector]}[data-user-id='#{target_user.id}']", text: expected[:latency_badge_text])
hoverable = find(".latency-value#{expected[:latency_badge_selector]}[data-user-id='#{target_user.id}']", text: expected[:latency_badge_text])
verify_score_hover(score, parent_selector, current_user, target_user)
verify_score_hover(score, current_user, target_user, hoverable)
end
def verify_score_hover(score, parent_selector, current_user, target_user)
expected = expected_score_info(score, parent_selector, current_user, target_user)
find(".latency-value#{expected[:latency_badge_selector]}[data-user-id='#{target_user.id}']", text: expected[:latency_badge_text]).help_bubble
# will verify that the score shown match the score desired
def verify_find_musician_score(score, current_user, target_user)
expected = expected_score_info(score, current_user, target_user)
Score.connection.execute('DELETE FROM scores').check
if score
create_score(austin, dallas, { auserid: current_user.id, buserid: target_user.id},
austin[:jamisp].beginip, dallas[:jamisp].beginip, 'a_client_id', 'b_client_id', score=score) # creates scores with very recent created_at, so it should be skipped
end
visit '/client#/musicians'
hoverable = find(".musician-list-result[data-musician-id='#{target_user.id}'] .score-count#{expected[:latency_badge_selector]} ")
hoverable.find('img')['src'].include?("icon_#{expected[:color]}_score.png").should be_true
verify_score_hover(score, current_user, target_user, hoverable)
end
# will verify that the score shown match the score desired
def verify_session_info_score(score, current_user, target_user)
expected = expected_score_info(score, current_user, target_user)
Score.connection.execute('DELETE FROM scores').check
if score
create_score(austin, dallas, { auserid: current_user.id, buserid: target_user.id},
austin[:jamisp].beginip, dallas[:jamisp].beginip, 'a_client_id', 'b_client_id', score=score) # creates scores with very recent created_at, so it should be skipped
end
visit current_path
hoverable = find(".rsvp-details[data-user-id='#{target_user.id}'] .latency#{expected[:latency_badge_selector]}", text: expected[:latency_badge_text])
verify_score_hover(score, current_user, target_user, hoverable)
end
# will verify that the score shown match the score desired
def verify_session_detail_score(score, current_user, target_user, target_path)
expected = expected_score_info(score, current_user, target_user)
Score.connection.execute('DELETE FROM scores').check
if score
create_score(austin, dallas, { auserid: current_user.id, buserid: target_user.id},
austin[:jamisp].beginip, dallas[:jamisp].beginip, 'a_client_id', 'b_client_id', score=score) # creates scores with very recent created_at, so it should be skipped
end
visit target_path
hoverable = find(".latency#{expected[:latency_badge_selector]}[data-user-id='#{target_user.id}']", text: expected[:latency_badge_text])
verify_score_hover(score, current_user, target_user, hoverable)
end
def verify_score_hover(score, current_user, target_user, hoverable)
hoverable.help_bubble
if current_user == target_user
find('.help-musician-score-self p', text: 'You are looking at your own account.')
@ -252,9 +305,10 @@ def verify_score_hover(score, parent_selector, current_user, target_user)
find('.help-musician-score-self .my-gear-latency .measurement-value', text: "13 ms*")
end
else
find('.help-musician-score-count .my-gear-latency .measurement-value', text: current_user.last_jam_audio_latency ? "#{current_user.last_jam_audio_latency.round} ms" : '13 ms*')
find('.help-musician-score-count .their-gear-latency .measurement-value', text: target_user.last_jam_audio_latency ? "#{target_user.last_jam_audio_latency.round} ms" : '13 ms*')
find('.help-musician-score-count .internet-latency .measurement-value', text: score ? "#{score} ms": '?')
find('.help-musician-score-count p', text: 'The score shown is the one-way latency (or delay) in milliseconds from you to this user. This score is calculated using the following three values that JamKazam gathers:')
find('.help-musician-score-count .my-gear-latency.partial .measurement-value', text: current_user.last_jam_audio_latency ? "#{current_user.last_jam_audio_latency.round} ms" : '13 ms*')
find('.help-musician-score-count .their-gear-latency.partial .measurement-value', text: target_user.last_jam_audio_latency ? "#{target_user.last_jam_audio_latency.round} ms" : '13 ms*')
find('.help-musician-score-count .internet-latency.partial .measurement-value', text: score ? "#{score} ms": '?')
end

View File

@ -2,12 +2,6 @@ module Requests
module FeatureHelpers
def poltergeist_setup
Capybara.javascript_driver = :poltergeist
Capybara.current_driver = Capybara.javascript_driver
Capybara.default_wait_time = 30 # these tests are SLOOOOOW
end
end
module JsonHelpers