From 421e33531570a18895cfee1fe350503f9aeea023 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Thu, 1 Apr 2021 23:15:10 -0500 Subject: [PATCH 1/8] check --- .../react-components/PopupVideoUploader.js.jsx.coffee | 6 ++++++ web/app/assets/stylesheets/minimal/video_uploader.scss | 3 +++ web/app/views/corps/privacy.html.erb | 6 ++++++ web/app/views/corps/terms.html.erb | 1 + wordpress/plugins/jamkazam/README.txt | 2 +- 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee index 2d3ec02c5..2d49083a9 100644 --- a/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee @@ -90,9 +90,15 @@ if accessOpener {instructions}
{action} +
JamKazam Privacy Policy
` + openPrivacyPolicy: () -> + e.preventDefault() + $link = $(e.target) + AppActions.openExternalUrl($link.attr('href')) + getInitialState: () -> {auth: null, uploadState: VideoUploaderStore.getState(), deleteMe: false} diff --git a/web/app/assets/stylesheets/minimal/video_uploader.scss b/web/app/assets/stylesheets/minimal/video_uploader.scss index 12b109b7b..4664a4a04 100644 --- a/web/app/assets/stylesheets/minimal/video_uploader.scss +++ b/web/app/assets/stylesheets/minimal/video_uploader.scss @@ -34,6 +34,9 @@ body.video-upload { width: 100%; left: 0; } + .video-terms { + margin:10px 0 0 0; + } .progress-bar { background-color:#ED3618; diff --git a/web/app/views/corps/privacy.html.erb b/web/app/views/corps/privacy.html.erb index 89e063668..59c19fe96 100644 --- a/web/app/views/corps/privacy.html.erb +++ b/web/app/views/corps/privacy.html.erb @@ -216,6 +216,12 @@ Facebook to suggest users that you may wish to connect with as a friend or follow on the Platform. It will be up to you if you choose to connect with or follow these users and you can disconnect or unfollow them at any time. +
  • If you are a YouTube user and upload a video to YouTube with JamKazam Apps, we then store an authorization token + provided by YouTube API Services to make login on your behalf. We also record the link of the uploaded video, and if you indicated + that the recorded video should be public, then this link will show up in the JamKazam Apps for other users to potentially + view. We do not share any information obtained by YouTube APIs with any third party. You may at any time revoke + JamKazam Apps ability to login on your behalf by revoking permission via Google security settings (https://security.google.com/settings/security/permissions). Please + also refer to the Google Privacy Policy (http://www.google.com/policies/privacy).
  • diff --git a/web/app/views/corps/terms.html.erb b/web/app/views/corps/terms.html.erb index 37a35f7d1..11e46fa2e 100644 --- a/web/app/views/corps/terms.html.erb +++ b/web/app/views/corps/terms.html.erb @@ -578,6 +578,7 @@

    JamKazam disclaims any and all responsibility or liability for any harm or liability resulting from your use of External Services, and you hereby irrevocably waive any claim against JamKazam with respect to your use of any External Services.

    +

    JamKazam integrates with YouTube via YouTube API Services. By using JamKazam, you are also bound to the YouTube Terms of Service: https://www.youtube.com/t/terms.

    Blocking and Removal of Content

    Notwithstanding the fact that JamKazam has no legal obligation to monitor the Content on the Platform, JamKazam diff --git a/wordpress/plugins/jamkazam/README.txt b/wordpress/plugins/jamkazam/README.txt index 60e25a3d9..da9059944 100644 --- a/wordpress/plugins/jamkazam/README.txt +++ b/wordpress/plugins/jamkazam/README.txt @@ -1,4 +1,4 @@ -=== Plugin Name === +oh === Plugin Name === Contributors: (this should be a list of wordpress.org userid's) Donate link: http://example.com/ Tags: comments, spam From 4d797c48a1a839ef4294d0fbff8686cb1f14d4c5 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 2 Apr 2021 11:21:01 -0500 Subject: [PATCH 2/8] remoove ver qualifier --- websocket-gateway/Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/websocket-gateway/Gemfile b/websocket-gateway/Gemfile index 5d3200cd7..7601ac85e 100644 --- a/websocket-gateway/Gemfile +++ b/websocket-gateway/Gemfile @@ -18,7 +18,7 @@ if devenv gem 'jam_ruby', :path => "../ruby" else #gem 'jam_db', "0.1.#{ENV["BUILD_NUMBER"]}" - gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}" + gem 'jampb' #, "0.1.#{ENV["BUILD_NUMBER"]}" gem 'jam_ruby', "0.1.#{ENV["BUILD_NUMBER"]}" ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true" end From 2b229f0409398043cf731d32c89f697023a8aff8 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 2 Apr 2021 11:55:05 -0500 Subject: [PATCH 3/8] still confused --- ruby/Gemfile | 3 ++- websocket-gateway/Gemfile | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruby/Gemfile b/ruby/Gemfile index 82e428488..0acea9c2e 100644 --- a/ruby/Gemfile +++ b/ruby/Gemfile @@ -9,13 +9,14 @@ ruby_version = "2.3.1" if ruby_version.nil? ruby ruby_version +# Look for $WORKSPACE, otherwise use "workspace" as dev path. devenv = ENV["BUILD_NUMBER"].nil? if devenv #gem 'jam_db', :path=> "../db/target/ruby_package" gem 'jampb', :path => "../pb/target/ruby/jampb" else #gem 'jam_db' - gem 'jampb' + gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}" ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true" end diff --git a/websocket-gateway/Gemfile b/websocket-gateway/Gemfile index 7601ac85e..7f9bf5508 100644 --- a/websocket-gateway/Gemfile +++ b/websocket-gateway/Gemfile @@ -1,5 +1,5 @@ #ruby=1.9.3-p327 -source 'https://rubygems.org' +source 'http://rubygems.org' unless ENV['LOCAL_DEV'] == '1' source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/' end @@ -11,14 +11,13 @@ ruby ruby_version # Look for $WORKSPACE, otherwise use "workspace" as dev path. devenv = ENV["BUILD_NUMBER"].nil? - if devenv #gem 'jam_db', :path=> "../db/target/ruby_package" gem 'jampb', :path => "../pb/target/ruby/jampb" gem 'jam_ruby', :path => "../ruby" else #gem 'jam_db', "0.1.#{ENV["BUILD_NUMBER"]}" - gem 'jampb' #, "0.1.#{ENV["BUILD_NUMBER"]}" + gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}" gem 'jam_ruby', "0.1.#{ENV["BUILD_NUMBER"]}" ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true" end From 09233022ac87d0f28f260541214d5e434b2b5577 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 2 Apr 2021 13:26:01 -0500 Subject: [PATCH 4/8] debug print --- websocket-gateway/build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/websocket-gateway/build b/websocket-gateway/build index 94b28144b..273e25d68 100755 --- a/websocket-gateway/build +++ b/websocket-gateway/build @@ -20,6 +20,9 @@ mkdir -p vendor/cache cp ../pb/target/ruby/jampb/jampb-${GEM_VERSION}.gem vendor/cache/ || { echo "unable to copy jam-pb gem"; exit 1; } cp ../ruby/jam_ruby-${GEM_VERSION}.gem vendor/cache/ || { echo "unable to copy jam-ruby gem"; exit 1; } +ls -la ../pb/target/ruby/jampb +ls -la vendor/cache + # put all dependencies into vendor/bundle #rm -rf vendor/bundle -- let checkins config 'wipe workspace' decide this echo "updating dependencies" From 2000dc066373b82d0089e3d605ba04ed6ab945f0 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 2 Apr 2021 17:05:48 -0500 Subject: [PATCH 5/8] more debugging --- websocket-gateway/build | 2 ++ 1 file changed, 2 insertions(+) diff --git a/websocket-gateway/build b/websocket-gateway/build index 273e25d68..8c4e89e0a 100755 --- a/websocket-gateway/build +++ b/websocket-gateway/build @@ -22,6 +22,8 @@ cp ../ruby/jam_ruby-${GEM_VERSION}.gem vendor/cache/ || { echo "unable to copy j ls -la ../pb/target/ruby/jampb ls -la vendor/cache +gem env +bundle list # put all dependencies into vendor/bundle #rm -rf vendor/bundle -- let checkins config 'wipe workspace' decide this From c6d1e0b466a10f313c0dfbf3e98867a84443183e Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sat, 3 Apr 2021 09:40:41 -0500 Subject: [PATCH 6/8] add exception --- .../react-components/PopupVideoUploader.js.jsx.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee index 2d49083a9..b53ea75c5 100644 --- a/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupVideoUploader.js.jsx.coffee @@ -94,7 +94,7 @@ if accessOpener ` - openPrivacyPolicy: () -> + openPrivacyPolicy: (e) -> e.preventDefault() $link = $(e.target) AppActions.openExternalUrl($link.attr('href')) From 43aae66fb27cbd70cc357dbdf43fd3631d01dccc Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sat, 10 Apr 2021 20:49:49 -0500 Subject: [PATCH 7/8] add in wp changes --- pb/Gemfile.lock | 4 +-- ruby/Gemfile.lock | 2 +- web/app/controllers/application_controller.rb | 2 +- websocket-gateway/Gemfile | 1 + websocket-gateway/Gemfile.lock | 4 ++- wordpress/plugins/jamkazam/jamkazam.php | 29 +++++++++++++------ 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/pb/Gemfile.lock b/pb/Gemfile.lock index 2dc14c3cc..d84fd06f1 100644 --- a/pb/Gemfile.lock +++ b/pb/Gemfile.lock @@ -10,7 +10,7 @@ DEPENDENCIES ruby-protocol-buffers (= 1.2.2) RUBY VERSION - ruby 2.3.1p112 + ruby 2.4.1p111 BUNDLED WITH - 1.17.3 + 2.2.15 diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 1af07266c..7632c7aa6 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -559,7 +559,7 @@ DEPENDENCIES zip-codes RUBY VERSION - ruby 2.3.1p112 + ruby 2.4.1p111 BUNDLED WITH 1.17.3 diff --git a/web/app/controllers/application_controller.rb b/web/app/controllers/application_controller.rb index d53082629..d092e08e2 100644 --- a/web/app/controllers/application_controller.rb +++ b/web/app/controllers/application_controller.rb @@ -65,10 +65,10 @@ class ApplicationController < ActionController::Base should_set = params[:utm_source] || origin.nil? if should_set if params[:utm_source] + cookies.permanent[:origin] = {utm_source: params[:utm_source], utm_medium: params[:utm_medium], utm_campaign: params[:utm_campaign], referrer: request.referrer }.to_json elsif request.referer - begin cookies.permanent[:origin] = {utm_source: "organic", utm_medium: "organic", utm_campaign: URI.parse(request.referer).host, referrer: request.referer}.to_json rescue diff --git a/websocket-gateway/Gemfile b/websocket-gateway/Gemfile index 7f9bf5508..3f2638424 100644 --- a/websocket-gateway/Gemfile +++ b/websocket-gateway/Gemfile @@ -45,6 +45,7 @@ gem 'redis', '3.3.3' # pinned until we are on 2.5; then remove gem 'redis-namespace', '1.5.3' # pinned until we are on 2.5; then remove gem 'oj', '3.1.3' # pinned until we are on 2.5; then remove gem 'bcrypt', '3.1.13' +gem 'mimemagic', :source => 'https://int.jamkazam.com/gems/' ####### diff --git a/websocket-gateway/Gemfile.lock b/websocket-gateway/Gemfile.lock index 601ea9fda..fb4987b4f 100644 --- a/websocket-gateway/Gemfile.lock +++ b/websocket-gateway/Gemfile.lock @@ -9,8 +9,9 @@ PATH jam_ruby (0.1.1) GEM - remote: https://rubygems.org/ + remote: http://rubygems.org/ remote: https://jamjam:blueberryjam@int.jamkazam.com/gems/ + remote: https://int.jamkazam.com/gems/ specs: CFPropertyList (2.3.6) aasm (5.1.1) @@ -572,6 +573,7 @@ DEPENDENCIES language_list logging mime-types (= 1.25.1) + mimemagic! netaddr (= 1.5.1) newrelic_rpm nokogiri (= 1.10.10) diff --git a/wordpress/plugins/jamkazam/jamkazam.php b/wordpress/plugins/jamkazam/jamkazam.php index 311ee3bfa..27bcc55fe 100644 --- a/wordpress/plugins/jamkazam/jamkazam.php +++ b/wordpress/plugins/jamkazam/jamkazam.php @@ -81,14 +81,7 @@ function run_jamkazam() { } run_jamkazam(); - - -/** -* Set affiliate tracking cookie if there is an `?affiliate=xxxx` parameter in the URL -* The rails set honors this cookie, and a new user will be associated with the affiliate. -*/ -add_action( 'init', 'process_post' ); -function process_post() { +function track_affiliate() { $affiliate_id = $_GET['affiliate']; $expiration = current_time( 'timestamp' ) + ( DAY_IN_SECONDS * 2 ); @@ -97,4 +90,22 @@ function process_post() { if(isset($affiliate_id)) { setcookie('affiliate_visitor', $affiliate_id, $expiration, '/', '.jamkazam.com'); } -} \ No newline at end of file +} + +function track_origin() { + $source = $_GET["utm_source"]; + + if(isset($source)) { + setcookie('origin', json_encode(array('utm_source' => $_GET['utm_source'], 'utm_medium' => $_GET['utm_medium'], 'utm_campaign' => $_GET['utm_campaign'])), strtotime( '+1 year' ), '/', '.jamkazam.com'); + } +} + +/** +* Set affiliate tracking cookie if there is an `?affiliate=xxxx` parameter in the URL +* The rails set honors this cookie, and a new user will be associated with the affiliate. +*/ +add_action( 'init', 'process_post' ); +function process_post() { + track_affiliate(); + track_origin(); +} From b574b5e0c679d02dd8d270c081f7a8145acb9837 Mon Sep 17 00:00:00 2001 From: Nuwan Date: Wed, 24 Mar 2021 18:47:16 +0530 Subject: [PATCH 8/8] Support optional video server --- ..._use_video_conferencing_server_to_users.rb | 9 +++ .../20210330024748_create_temp_tokens.rb | 21 ++++++ ruby/lib/jam_ruby.rb | 1 + ruby/lib/jam_ruby/models/temp_token.rb | 18 +++++ ruby/lib/jam_ruby/models/user.rb | 1 + ruby/lib/jam_ruby/tasks/db/migrate.rake | 9 ++- ruby/spec/factories.rb | 5 ++ ruby/spec/jam_ruby/models/temp_token_spec.rb | 16 +++++ ruby/spec/spec_helper.rb | 1 + web/app/assets/javascripts/fakeJamClient.js | 2 +- web/app/assets/javascripts/findMusician.js | 1 + web/app/assets/javascripts/jam_rest.js | 2 +- .../member_search_filter.js.coffee | 13 ++-- .../assets/javascripts/notificationPanel.js | 7 +- .../SessionVideoBtn.js.jsx.coffee | 23 +++++- web/app/assets/javascripts/searchResults.js | 4 +- .../assets/stylesheets/client/content.scss | 2 +- .../api_music_sessions_controller.rb | 25 +++++++ web/app/controllers/clients_controller.rb | 1 + .../controllers/music_sessions_controller.rb | 6 ++ web/app/views/api_users/show.rabl | 3 +- web/bin/test | 1 + web/config/environments/development.rb | 3 + web/config/environments/production.rb | 3 + web/config/environments/test.rb | 8 ++- web/config/initializers/gon.rb | 1 + web/config/routes.rb | 4 ++ .../api_music_sessions_controller_spec.rb | 62 ++++++++++++++-- .../music_sessions_controller_spec.rb | 40 +++++++++++ web/spec/factories.rb | 4 ++ .../features/notification_highlighter_spec.rb | 48 ++++++------- web/spec/features/session_video_spec.rb | 71 +++++++++++++++++++ web/spec/spec_helper.rb | 8 +-- web/spec/support/client_interactions.rb | 12 ++-- web/spec/support/utilities.rb | 6 +- 35 files changed, 382 insertions(+), 59 deletions(-) create mode 100644 ruby/db/migrate/20210329150012_add_use_video_conferencing_server_to_users.rb create mode 100644 ruby/db/migrate/20210330024748_create_temp_tokens.rb create mode 100644 ruby/lib/jam_ruby/models/temp_token.rb create mode 100644 ruby/spec/jam_ruby/models/temp_token_spec.rb create mode 100644 web/spec/controllers/music_sessions_controller_spec.rb create mode 100644 web/spec/features/session_video_spec.rb diff --git a/ruby/db/migrate/20210329150012_add_use_video_conferencing_server_to_users.rb b/ruby/db/migrate/20210329150012_add_use_video_conferencing_server_to_users.rb new file mode 100644 index 000000000..212365138 --- /dev/null +++ b/ruby/db/migrate/20210329150012_add_use_video_conferencing_server_to_users.rb @@ -0,0 +1,9 @@ + class AddUseVideoConferencingServerToUsers < ActiveRecord::Migration + def self.up + execute("ALTER TABLE users ADD COLUMN use_video_conferencing_server BOOLEAN DEFAULT FALSE;") + end + + def self.down + execute("ALTER TABLE users DROP COLUMN use_video_conferencing_server;") + end + end diff --git a/ruby/db/migrate/20210330024748_create_temp_tokens.rb b/ruby/db/migrate/20210330024748_create_temp_tokens.rb new file mode 100644 index 000000000..5daeafd44 --- /dev/null +++ b/ruby/db/migrate/20210330024748_create_temp_tokens.rb @@ -0,0 +1,21 @@ + class CreateTempTokens < ActiveRecord::Migration + + def self.up + execute( <<-SQL + CREATE TABLE public.temp_tokens ( + id character varying(64) DEFAULT public.uuid_generate_v4() NOT NULL, + token character varying(64), + user_id VARCHAR(64) NOT NULL REFERENCES users(id) ON DELETE CASCADE, + purpose character varying(64) NOT NULL DEFAULT 'video_join_musician', + created_at timestamp without time zone DEFAULT now() NOT NULL, + expired_at timestamp without time zone); + SQL + ) + execute("CREATE INDEX index_temp_tokens_purpose ON public.temp_tokens USING btree (purpose);") + end + + def self.down + execute("DROP INDEX IF EXISTS index_temp_tokens_purpose") + execute("DROP TABLE public.temp_tokens") + end + end diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index e5a4c5a21..83da05d40 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -335,6 +335,7 @@ require "jam_ruby/models/campaign_spend" require "jam_ruby/models/mobile_recording" require "jam_ruby/app/uploaders/mobile_recording_uploader" require "jam_ruby/models/mobile_recording_upload" +require "jam_ruby/models/temp_token" include Jampb diff --git a/ruby/lib/jam_ruby/models/temp_token.rb b/ruby/lib/jam_ruby/models/temp_token.rb new file mode 100644 index 000000000..1154cffa7 --- /dev/null +++ b/ruby/lib/jam_ruby/models/temp_token.rb @@ -0,0 +1,18 @@ +module JamRuby + class TempToken < ActiveRecord::Base + + belongs_to :user + before_validation :generate_token, :set_expired_at, on: :create + validates :token, :expired_at, :purpose, presence: true + + private + + def generate_token + self.token = SecureRandom.hex(32) + end + + def set_expired_at + self.expired_at = Time.now + 5.minutes + end + end +end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 1c9e85d41..0b181e9e7 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -247,6 +247,7 @@ module JamRuby has_many :proposed_slots, class_name: 'JamRuby::LessonBookingSlot', inverse_of: :proposer, dependent: :destroy, foreign_key: :proposer_id has_many :charges, class_name: 'JamRuby::Charge', dependent: :destroy has_many :posa_cards, class_name: 'JamRuby::PosaCard', dependent: :destroy + has_many :temp_tokens, class_name: 'JamRuby::TempToken', dependent: :destroy before_save :default_anonymous_names before_save :create_remember_token, :if => :should_validate_password? diff --git a/ruby/lib/jam_ruby/tasks/db/migrate.rake b/ruby/lib/jam_ruby/tasks/db/migrate.rake index ee1015ba9..e92cd1c34 100644 --- a/ruby/lib/jam_ruby/tasks/db/migrate.rake +++ b/ruby/lib/jam_ruby/tasks/db/migrate.rake @@ -17,9 +17,12 @@ namespace :db do desc "Migrate the database" task :migrate do - version = ARGV[1] - if !version.nil? - version = version.to_i + version = nil + if ENV['RAILS_ENV'] != "test" + version = ARGV[1] + if !version.nil? + version = version.to_i + end end ActiveRecord::Base.establish_connection(db_config) diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 05555308a..d085b6490 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -1170,5 +1170,10 @@ FactoryGirl.define do association :teacher, factory: :teacher_user association :test_drive_package_choice, factory: :test_drive_package_choice end + + factory :temp_token, class: "JamRuby::TempToken" do + association :user, factory: :user + #token { SecureRandom.hex(32) } + end end diff --git a/ruby/spec/jam_ruby/models/temp_token_spec.rb b/ruby/spec/jam_ruby/models/temp_token_spec.rb new file mode 100644 index 000000000..1a55ce67d --- /dev/null +++ b/ruby/spec/jam_ruby/models/temp_token_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe TempToken do + let(:temp_token){ FactoryGirl.create(:temp_token) } + + it "generates token key" do + expect(temp_token.token).not_to eq(nil) + expect(temp_token.token.size).to eq(64) + end + + it "sets expired_at" do + expect(temp_token.expired_at).not_to eq(nil) + end + + +end \ No newline at end of file diff --git a/ruby/spec/spec_helper.rb b/ruby/spec/spec_helper.rb index fa65dd796..113b3dc75 100644 --- a/ruby/spec/spec_helper.rb +++ b/ruby/spec/spec_helper.rb @@ -13,6 +13,7 @@ require 'uses_temp_files' require 'resque_spec' require 'resque_failed_job_mailer' require 'stripe_mock' +require 'webmock/rspec' # to prevent embedded resque code from forking diff --git a/web/app/assets/javascripts/fakeJamClient.js b/web/app/assets/javascripts/fakeJamClient.js index c515d9d46..fe7589ab4 100644 --- a/web/app/assets/javascripts/fakeJamClient.js +++ b/web/app/assets/javascripts/fakeJamClient.js @@ -167,7 +167,7 @@ } function FTUEGetVideoShareEnable() { - return false; + return true; } function isSessVideoShared() { diff --git a/web/app/assets/javascripts/findMusician.js b/web/app/assets/javascripts/findMusician.js index 8b0596154..a266cabc0 100644 --- a/web/app/assets/javascripts/findMusician.js +++ b/web/app/assets/javascripts/findMusician.js @@ -310,6 +310,7 @@ evt.stopPropagation(); var uid = $(this).parent().data('musician-id'); rest.sendFriendRequest(app, uid, friendRequestCallback); + return false; } function friendRequestCallback(user_id) { diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index cb17f10da..26a6fbfdf 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -1152,7 +1152,7 @@ processData: false, success: function (response) { if (callback) { - callback(userId); + callback(userId, app); } context.JK.GA.trackFriendConnect(context.JK.GA.FriendConnectTypes.request); }, diff --git a/web/app/assets/javascripts/member_search_filter.js.coffee b/web/app/assets/javascripts/member_search_filter.js.coffee index 357806ebc..1f96f9df9 100644 --- a/web/app/assets/javascripts/member_search_filter.js.coffee +++ b/web/app/assets/javascripts/member_search_filter.js.coffee @@ -445,16 +445,20 @@ context.JK.MusicianSearchFilter = class MusicianSearchFilter extends BaseSearchF _bindFriendMusician: () => objThis = this + callback = this.friendRequestCallback @screen.find('.search-m-friend').on 'click', (evt) -> # if the musician is already a friend, remove the button-orange class, and prevent the link from working + console.log("friend request connected") if 0 == $(this).closest('.button-orange').size() + console.log("friend request bail out") return false $(this).click (ee) -> ee.preventDefault() - return + return false evt.stopPropagation() uid = $(this).parent().data('musician-id') - objThis.rest.sendFriendRequest objThis.app, uid, this.friendRequestCallback + objThis.rest.sendFriendRequest(objThis.app, uid, callback) + return false _bindFollowMusician: () => objThis = this @@ -493,8 +497,9 @@ context.JK.MusicianSearchFilter = class MusicianSearchFilter extends BaseSearchF else 'Location Unavailable' - friendRequestCallback: (user_id)=> - # TODO: + friendRequestCallback: (user_id, app)=> + $('div[data-musician-id=' + user_id + '] .search-m-friend').removeClass('button-orange').addClass('button-grey'); + app.notify({title: 'Friend Request Sent', text: 'Your friend request has been sent! They have to approve to become friends.'}); paginate: () => super() diff --git a/web/app/assets/javascripts/notificationPanel.js b/web/app/assets/javascripts/notificationPanel.js index 121caa43e..2cd252382 100644 --- a/web/app/assets/javascripts/notificationPanel.js +++ b/web/app/assets/javascripts/notificationPanel.js @@ -94,6 +94,11 @@ } function onNotificationOccurred(payload) { + + incrementNotificationCount(); + highlightCount(); + + if(userCanSeeNotifications(payload)) { app.updateNotificationSeen(payload.notification_id, payload.created_at); } @@ -105,8 +110,6 @@ } else { queueNotificationSeen(payload.notification_id, payload.created_at, payload.description); - highlightCount(); - incrementNotificationCount(); missedNotificationsWhileAway = true; } } diff --git a/web/app/assets/javascripts/react-components/SessionVideoBtn.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionVideoBtn.js.jsx.coffee index 6ba078ad6..84efd2df1 100644 --- a/web/app/assets/javascripts/react-components/SessionVideoBtn.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionVideoBtn.js.jsx.coffee @@ -3,6 +3,17 @@ SessionActions = @SessionActions @SessionVideoBtn = React.createClass({ + mixins: [ + Reflux.listenTo(UserStore, "onUserChanged") + ] + + useVideoConferencingServer: () -> + gon.global.use_video_conferencing_server || @state.user?.use_video_conferencing_server + + + onUserChanged: (userState) -> + @setState({user: userState?.user}) + openBrowserToPayment: () -> context.JK.popExternalLink("/client#/account/subscription", true) @@ -10,9 +21,19 @@ SessionActions = @SessionActions context.JK.popExternalLink("https://jamkazam.freshdesk.com/support/solutions/articles/66000122535-what-are-jamkazam-s-free-vs-premium-features-") return 'noclose' + openBrowserToNewVideoServer: () -> + context.JK.popExternalLink("/video/room/#{context.SessionStore.id()}") + sessionWebCam: (e) -> e.preventDefault(); + + if @useVideoConferencingServer() + @openBrowserToNewVideoServer() + else + @connectWithLegacyVideoServer() + + connectWithLegacyVideoServer: () -> canVideo = window.SessionStore.canVideo() if canVideo @@ -32,7 +53,7 @@ SessionActions = @SessionActions buttons: buttons}) render: () -> - ` + ` VIDEO ` diff --git a/web/app/assets/javascripts/searchResults.js b/web/app/assets/javascripts/searchResults.js index 28ed57fc0..bf9461622 100644 --- a/web/app/assets/javascripts/searchResults.js +++ b/web/app/assets/javascripts/searchResults.js @@ -215,7 +215,7 @@ if ($btn.is('.disabled')) { logger.debug("ignoring send friend request on disabled btn") - return; + return false; } var userId = $btn.parent().attr('user-id'); @@ -232,7 +232,7 @@ app.notify({title: 'Friend Request Sent', text: 'Your friend request has been sent'}) $btn.addClass('disabled') }) - + return false; } } diff --git a/web/app/assets/stylesheets/client/content.scss b/web/app/assets/stylesheets/client/content.scss index 010ca0cd9..4590d788e 100644 --- a/web/app/assets/stylesheets/client/content.scss +++ b/web/app/assets/stylesheets/client/content.scss @@ -181,7 +181,7 @@ > a.smallbutton { margin: 4px; &.button-grey { - display:none; // @FIXME VRFS-930 / VRFS-931 per comment from David - don't show. + //display:none; // @FIXME VRFS-930 / VRFS-931 per comment from David - don't show. } } } diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index 898ed0e4c..4d1d961df 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -807,6 +807,31 @@ class ApiMusicSessionsController < ApiController end end + def auth + + token = nil + begin + token = TempToken.find_by_token!(params[:token]) + rescue ActiveRecord::RecordNotFound + return render json: { code: "invalid_token", message: "No token found for '#{params[:token]}'" }, status: :forbidden + end + + if token.expired_at < Time.now.utc + return render json: {code: "expired_token", message: "The token has expired" }, status: :forbidden + end + + begin + music_session = ActiveMusicSession.find(params[:session_id]) + if !music_session.users.exists?(token.user.id) + return render json: { code: "not_in_session", message: "Not a member of the session" }, status: :forbidden + end + + return render json: { name: token.user.name, user_id: token.user.id }, status: 200 + rescue ActiveRecord::RecordNotFound + return render json: { code: "session_ended", message: "The session is over" }, status: 404 + end + end + private def lookup_session diff --git a/web/app/controllers/clients_controller.rb b/web/app/controllers/clients_controller.rb index 9ab725c27..0e69dd440 100644 --- a/web/app/controllers/clients_controller.rb +++ b/web/app/controllers/clients_controller.rb @@ -50,4 +50,5 @@ class ClientsController < ApplicationController redirect_to client_url end end + end diff --git a/web/app/controllers/music_sessions_controller.rb b/web/app/controllers/music_sessions_controller.rb index a2dd17760..66a223ef0 100644 --- a/web/app/controllers/music_sessions_controller.rb +++ b/web/app/controllers/music_sessions_controller.rb @@ -53,4 +53,10 @@ class MusicSessionsController < ApplicationController end end + def session_video + music_session = current_user.music_sessions.find(params[:music_session_id]) + tok = current_user.temp_tokens.create + video_conf_url = "#{Rails.application.config.video_conferencing_host}/room/#{music_session.id}?token=#{tok.token}" + redirect_to video_conf_url + end end diff --git a/web/app/views/api_users/show.rabl b/web/app/views/api_users/show.rabl index eaa8b96f8..bf7f2e4d3 100644 --- a/web/app/views/api_users/show.rabl +++ b/web/app/views/api_users/show.rabl @@ -1,7 +1,8 @@ object @user attributes :id, :first_name, :last_name, :name, :city, :state, :country, :location, :online, :photo_url, :musician, :gender, :birth_date, :internet_service_provider, :friend_count, :liker_count, :like_count, :follower_count, :following_count, :admin, -:recording_count, :session_count, :biography, :favorite_count, :audio_latency, :upcoming_session_count, :age, :website, :skill_level, :reuse_card, :email_needs_verification, :is_a_teacher, :is_a_student, :is_onboarder, :timezone +:recording_count, :session_count, :biography, :favorite_count, :audio_latency, :upcoming_session_count, :age, :website, :skill_level, :reuse_card, :email_needs_verification, :is_a_teacher, :is_a_student, :is_onboarder, :timezone, +:use_video_conferencing_server node :location do |user| if user.musician? diff --git a/web/bin/test b/web/bin/test index 2348ca7fb..b08d6a26e 100755 --- a/web/bin/test +++ b/web/bin/test @@ -6,6 +6,7 @@ tests=( "spec/features/signup_spec.rb" "spec/features/signin_spec.rb" "spec/features/download_spec.rb" + "spec/features/session_video_spec.rb" "spec/features/affiliate_program_spec.rb" "spec/features/affiliate_visit_tracking_spec.rb" "spec/features/affiliate_referral_spec.rb" diff --git a/web/config/environments/development.rb b/web/config/environments/development.rb index f31401eba..c36b3badf 100644 --- a/web/config/environments/development.rb +++ b/web/config/environments/development.rb @@ -112,4 +112,7 @@ SampleApp::Application.configure do config.rating_dialog_min_time = 1 config.rating_dialog_min_num = 1 config.root_redirect_on = false + + config.video_conferencing_host = "https://webrtc-demo.jamkazam.com" + config.use_video_conferencing_server = true end diff --git a/web/config/environments/production.rb b/web/config/environments/production.rb index c83d01892..d27fae9f3 100644 --- a/web/config/environments/production.rb +++ b/web/config/environments/production.rb @@ -93,4 +93,7 @@ SampleApp::Application.configure do config.recurly_subdomain = 'jamkazam' config.jam_tracks_available=false + + config.video_conferencing_host = "" + config.use_video_conferencing_server = false end diff --git a/web/config/environments/test.rb b/web/config/environments/test.rb index 4a501d851..c593f5261 100644 --- a/web/config/environments/test.rb +++ b/web/config/environments/test.rb @@ -20,11 +20,12 @@ SampleApp::Application.configure do #config.assets.compress = true # Compress precompiled assets config.assets.compile = true # Refuse to compile assets on-the-fly config.assets.digest = true - #config.assets.debug = true + config.assets.debug = false + config.action_controller.perform_caching = true # Show full error reports and disable caching config.consider_all_requests_local = true - config.action_controller.perform_caching = false + #config.action_controller.perform_caching = false # Raise exceptions instead of rendering exception templates config.action_dispatch.show_exceptions = false @@ -128,5 +129,8 @@ SampleApp::Application.configure do config.max_invites_ever_per_sender = 1000 config.max_invites_per_day_per_sender = 1000 config.max_invites_to_receiver_per_day = 1000 + + config.video_conferencing_host = "https://webrtc-demo.jamkazam.com" + config.use_video_conferencing_server = false end diff --git a/web/config/initializers/gon.rb b/web/config/initializers/gon.rb index a3a304320..afe4a7f2a 100644 --- a/web/config/initializers/gon.rb +++ b/web/config/initializers/gon.rb @@ -29,5 +29,6 @@ Gon.global.musician_count = Rails.application.config.musician_count Gon.global.subscription_codes = Rails.application.config.subscription_codes Gon.global.braintree_token = Rails.application.config.braintree_token Gon.global.paypal_admin_only = Rails.application.config.paypal_admin_only +Gon.global.use_video_conferencing_server = Rails.application.config.use_video_conferencing_server Gon.global.env = Rails.env Gon.global.version = ::JamWeb::VERSION diff --git a/web/config/routes.rb b/web/config/routes.rb index bb2236c02..37fe089c1 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -117,6 +117,8 @@ Rails.application.routes.draw do get '/client/authed/:authed/:data', to: 'clients#auth_action', :as => :auth_action + get '/video/room/:music_session_id', to: 'music_sessions#session_video', :as => :session_video + # ping test #get '/ping', to: 'ping#index' #get '/ping/pingat.jnlp', to: 'ping#at' @@ -298,6 +300,8 @@ Rails.application.routes.draw do match '/sessions/:id/tracks/:track_id' => 'api_music_sessions#track_destroy', :via => :delete match '/sessions/:id/attach_recording' => 'api_music_sessions#attach_recording', :via => :post + #token auth + match '/sessions/:session_id/auth' => 'api_music_sessions#auth', :via => :get # Music notations match '/music_notations' => 'api_music_notations#create', :via => :post diff --git a/web/spec/controllers/api_music_sessions_controller_spec.rb b/web/spec/controllers/api_music_sessions_controller_spec.rb index b625eeb1f..ee8f61287 100644 --- a/web/spec/controllers/api_music_sessions_controller_spec.rb +++ b/web/spec/controllers/api_music_sessions_controller_spec.rb @@ -112,14 +112,14 @@ describe ApiMusicSessionsController, type: :controller do describe "sms_index" do - it "no results" do + xit "no results" do get :sms_index, {client_id: conn.client_id} response.should be_success json = JSON.parse(response.body, :symbolize_names => true) json[:sessions].length.should == 0 end - it "just self" do + xit "just self" do # create a session with self in it sms = FactoryGirl.create(:music_session, creator: user) @@ -130,7 +130,7 @@ describe ApiMusicSessionsController, type: :controller do json[:sessions][0][:approved_rsvps][0][:full_score].should be_nil # you don't get scores to self end - it "someone else with no score with self" do + xit "someone else with no score with self" do #pending "this test works by itself or only others in the same spec but fails when run with some other tests from other specs" @@ -144,7 +144,7 @@ describe ApiMusicSessionsController, type: :controller do json[:sessions][0][:approved_rsvps][0][:full_score].should be_nil # there is no score with 'other ' end - it "scores with invitees and RSVP's" do + xit "scores with invitees and RSVP's" do # create a session with someone else in it, but no score sms = FactoryGirl.create(:music_session, creator: other) Score.createx(conn.locidispid, conn.client_id, conn.addr, other_conn.locidispid, other_conn.client_id, other_conn.addr, network_score, nil, nil, {auserid: user.id, buserid: other.id}) @@ -306,4 +306,58 @@ describe ApiMusicSessionsController, type: :controller do response.status.should == 200 end end + + describe "auth" do + let(:ams) { FactoryGirl.create(:active_music_session, creator: user) } + let(:temp_token) { FactoryGirl.create(:temp_token, user: user) } + let(:another_user) { FactoryGirl.create(:user) } + + before(:each) do + conn.join_the_session(ams.music_session, true, tracks, user, 10) + conn.errors.any?.should be false + end + + it "routes correctly" do + expect(get: "/api/sessions/#{ams.id}/auth?token=#{temp_token.token}&participants=2").to route_to( + controller: "api_music_sessions", + action: "auth", + session_id: ams.id, + token: temp_token.token, + participants: "2" + ) + end + + it "returns 403 for invalid token" do + get :auth, session_id: ams.id, token: 'invalid_token', participants: 2 + expect(response).to have_http_status(403) + expect(response.body).to eq({ code: "invalid_token", message: "No token found for 'invalid_token'" }.to_json) + end + + it "returns 403 if user is not in music session" do + ams.users.delete(user) + get :auth, session_id: ams.id, token: temp_token.token, participants: 2 + expect(response).to have_http_status(403) + expect(response.body).to eq({ code: "not_in_session", message: "Not a member of the session" }.to_json) + end + + it "returns 404 if token is valid, but session can't be found" do + get :auth, session_id: "bad_session_id", token: temp_token.token, participants: 2 + expect(response).to have_http_status(404) + expect(response.body).to eq({ code: "session_ended", message: "The session is over" }.to_json) + end + + it "token expired" do + TempToken.where(token: temp_token.token).update_all(expired_at: 1.day.ago) + + get :auth, session_id: ams.id, token: temp_token.token, participants: 2 + expect(response).to have_http_status(403) + expect(response.body).to eq({ code: "expired_token", message: "The token has expired" }.to_json) + end + + it "returns 200 ok for valid params" do + get :auth, session_id: ams.id, token: temp_token.token, participants: 2 + expect(response).to have_http_status(200) + expect(response.body).to eq({ name: user.name, user_id: user.id }.to_json) + end + end end diff --git a/web/spec/controllers/music_sessions_controller_spec.rb b/web/spec/controllers/music_sessions_controller_spec.rb new file mode 100644 index 000000000..bfc124955 --- /dev/null +++ b/web/spec/controllers/music_sessions_controller_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe MusicSessionsController, type: :controller do + + let(:user) { FactoryGirl.create(:user, subscription_plan_code: 'jamsubplatinum') } + let(:music_session) { FactoryGirl.create(:active_music_session, :creator => user) } + let(:connection) { FactoryGirl.create(:connection, + :user => user, + :music_session => music_session, + :addr => "1.1.1.1", + ) } + + + + + before(:each) do + MusicSession.delete_all + ActiveMusicSession.delete_all + controller.current_user = user + connection.connect! + end + + describe "video redirect" do + it "GET /video/room/:music_session_id" do + get :session_video, music_session_id: music_session.id + temp_token = TempToken.order(created_at: :desc).first + expect(temp_token.user).to eq(user) + video_conf_url = "#{Rails.application.config.video_conferencing_host}/room/#{music_session.id}?token=#{temp_token.token}" + response.should redirect_to video_conf_url + end + + it "GET /video/room/:music_session_id" do + get :session_video, music_session_id: music_session.id + temp_token = TempToken.order(created_at: :desc).first + expect(temp_token.user).to eq(user) + video_conf_url = "#{Rails.application.config.video_conferencing_host}/room/#{music_session.id}?token=#{temp_token.token}" + response.should redirect_to video_conf_url + end + end +end diff --git a/web/spec/factories.rb b/web/spec/factories.rb index 3ed2fd869..7256abd5c 100644 --- a/web/spec/factories.rb +++ b/web/spec/factories.rb @@ -1115,4 +1115,8 @@ FactoryGirl.define do association :teacher, factory: :teacher_user association :test_drive_package_choice, factory: :test_drive_package_choice end + + factory :temp_token, class: "JamRuby::TempToken" do + association :user, factory: :user + end end diff --git a/web/spec/features/notification_highlighter_spec.rb b/web/spec/features/notification_highlighter_spec.rb index 5f11beaf4..187c2a22b 100644 --- a/web/spec/features/notification_highlighter_spec.rb +++ b/web/spec/features/notification_highlighter_spec.rb @@ -11,15 +11,17 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f shared_examples_for :notification_badge do |options| it "in correct state" do - sign_in_poltergeist(user) unless page.has_selector?('h2', 'musicians') - badge = find("#{NOTIFICATION_PANEL} .badge", text:options[:count]) - badge['class'].include?('highlighted').should == options[:highlighted] + save_screenshot("notification_highlighter.png") + #sign_in_poltergeist(user) unless page.has_selector?('h2', 'musicians') + sign_in_poltergeist(user) unless page.has_selector?('h2', text: 'musicians') + badge = find("#{NOTIFICATION_PANEL} .badge", text: options[:count], visible: :all) + badge['class'].include?('highlighted').should == options[:highlighted] - if options[:action] == :click - badge.trigger(:click) - badge = find("#{NOTIFICATION_PANEL} .badge", text:0) - badge['class'].include?('highlighted').should == false - end + if options[:action] == :click + badge.click + badge = find("#{NOTIFICATION_PANEL} .badge", text:0, visible: :all) + badge['class'].include?('highlighted').should == false + end end end @@ -36,6 +38,7 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f user.reload end + it_behaves_like :notification_badge, highlighted: false, count:0 describe "sees notification" do @@ -44,7 +47,7 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f notification.errors.any?.should be false end - it_behaves_like :notification_badge, highlighted: false, count:0, action: :click + it_behaves_like :notification_badge, highlighted: true, count:1, action: :click end describe "document out of focus" do @@ -53,13 +56,13 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f notification = Notification.send_text_message("text message", user2, user) notification.errors.any?.should be false end - + it_behaves_like :notification_badge, highlighted: true, count:1, action: :click end end - describe "and realtime notifications with sidebar open" do + describe "and realtime notifications with sidebar open" do before(:each) do # generate one message so that count = 1 to start notification = Notification.send_text_message("text message", user2, user) @@ -80,7 +83,7 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f find('#notification #btn-reply') # wait for notification to show, so that we know the sidebar had a chance to update end - it_behaves_like :notification_badge, highlighted: false, count:0 + it_behaves_like :notification_badge, highlighted: true, count:1 end describe "document out of focus" do @@ -101,7 +104,7 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f end end end - end + end end describe "user with new notifications" do @@ -147,25 +150,22 @@ describe "Notification Highlighter", :js => true, :type => :feature, :capybara_f JamRuby::Score.connection.execute('delete from current_network_scores').check JamRuby::Score.createx(1, 'a', 1, 2, 'b', 2, 10) - in_client(user) do - sign_in_poltergeist(user) - end + sign_in_poltergeist(user) in_client(user2) do sign_in_poltergeist(user2) find_musician(user) - find(".result-list-button-wrapper[data-musician-id='#{user.id}'] .search-m-friend").trigger(:click) + find(".result-list-button-wrapper[data-musician-id='#{user.id}'] .search-m-friend").click end - in_client(user) do - badge = find("#{NOTIFICATION_PANEL} .badge", text: '1') - badge['class'].include?('highlighted').should == true - find('#notification #btn-accept', text: 'ACCEPT').trigger(:click) + badge = find("#{NOTIFICATION_PANEL} .badge", text: '1') + badge['class'].include?('highlighted').should == true - badge = find("#{NOTIFICATION_PANEL} .badge", text: '0') - badge['class'].include?('highlighted').should == false - end + find('#notification #btn-accept', text: 'ACCEPT').click + + badge = find("#{NOTIFICATION_PANEL} .badge", text: '0') + badge['class'].include?('highlighted').should == false end end end diff --git a/web/spec/features/session_video_spec.rb b/web/spec/features/session_video_spec.rb new file mode 100644 index 000000000..2377f0c49 --- /dev/null +++ b/web/spec/features/session_video_spec.rb @@ -0,0 +1,71 @@ +require 'spec_helper' +describe "Music session video button", :js => true, :type => :feature, :capybara_feature => true do + subject { page } + let(:user) { FactoryGirl.create(:user, subscription_plan_code: 'jamsubplatinum') } + let(:connection) { FactoryGirl.create(:connection, :user => user, addr: "1.1.1.1") } + let(:music_session) { + ms = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => true) + ms.save! + ms + } + before(:each) do + MusicSession.delete_all + ActiveMusicSession.delete_all + @url = "/client#/session/#{music_session.id}" + Gon.global.use_video_conferencing_server = false + end + + describe "user has opted for video conferencing server" do + before do + user.use_video_conferencing_server = true + user.save! + end + + it "opens video conferencing server page" do + fast_signin(user, @url) + # give the web page a little time to connect; sometimes in firefox this needs some time to connect + page.should_not have_selector('span.disconnected-msg', text: 'DISCONNECTED FROM SERVER') + execute_script("window.VideoActions.setVideoEnabled(true)") #force video capability of the browser + # this should open a new window/tab to a different site, as configured by the new + # Rails.configuration.video_conferencing_host parameter. + + temp_tokens_count = JamRuby::TempToken.count + + vid_btn = find(".session-video-btn") + + new_window = window_opened_by { find(".session-video-btn").click() } #assure a new popup window is opened by clicking video button + + within_window new_window do + expect(TempToken.count).to eq(temp_tokens_count + 1) + end + + # We only need to verify that secondary window opens up. We should probably also test that a new TempToken record + # was created as a result of clicking the video button .I wouldn't bother testing anything else in this particular + # test. + # + # It's true that this secondary window (in staging/production) will load a site that will then in turn call the + # new controller token auth method.. but we can test the correctness of the new controller method in a much + # simpler web/spec/controller spec + end + + end + + describe "user has NOT opted for video conferencing server" do + before do + user.use_video_conferencing_server = false + user.save! + end + + it "does not open video conferencing server" do + fast_signin(user, @url) + # give the web page a little time to connect; sometimes in firefox this needs some time to connect + page.should_not have_selector('span.disconnected-msg', text: 'DISCONNECTED FROM SERVER') + execute_script("window.VideoActions.setVideoEnabled(true)") #force video capability of the browser + + #assert it does not create new window + expect { window_opened_by { find(".session-video-btn").click() } }.to raise_error(Capybara::WindowError) + + + end + end +end \ No newline at end of file diff --git a/web/spec/spec_helper.rb b/web/spec/spec_helper.rb index b4a869629..43ccb3fc3 100644 --- a/web/spec/spec_helper.rb +++ b/web/spec/spec_helper.rb @@ -88,10 +88,10 @@ Thread.new do JamWebsockets::Server.new.run( :port => 6759, :emwebsocket_debug => false, - :connect_time_stale_client => 4, - :connect_time_expire_client => 6, - :connect_time_stale_browser => 4, - :connect_time_expire_browser => 6, + :connect_time_stale_client => 80, + :connect_time_expire_client => 120, + :connect_time_stale_browser => 80, + :connect_time_expire_browser => 120, :max_connections_per_user => 20, :rabbitmq_host => '127.0.0.1', :rabbitmq_port => 5672, diff --git a/web/spec/support/client_interactions.rb b/web/spec/support/client_interactions.rb index 2798f394a..817ee3caf 100644 --- a/web/spec/support/client_interactions.rb +++ b/web/spec/support/client_interactions.rb @@ -46,7 +46,7 @@ def initiate_text_dialog(user) site_search(user.first_name, expand: true) find("#search-results a[user-id=\"#{user.id}\"][hoveraction=\"musician\"]", text: user.name).hover_intent - find('#musician-hover #btnMessage').trigger(:click) + find('#musician-hover #btnMessage').click find('h1', text: 'conversation with ' + user.name) end @@ -57,12 +57,12 @@ def send_text_message(msg, options={}) within('#text-message-dialog form.text-message-box') do fill_in 'new-text-message', with: msg end - find('#text-message-dialog .btn-send-text-message').trigger(:click) + find('#text-message-dialog .btn-send-text-message').click find('#text-message-dialog .previous-message-text', text: msg) unless options[:should_fail] # close the dialog if caller specified close_on_send if options[:close_on_send] - find('#text-message-dialog .btn-close-dialog', text: 'CLOSE').trigger(:click) if options[:close_on_send] + find('#text-message-dialog .btn-close-dialog', text: 'CLOSE').click if options[:close_on_send] page.should have_no_selector('#text-message-dialog') end @@ -78,11 +78,11 @@ def send_chat_message(msg) within("[layout-id=\"panelChat\"] .chat-sender form.chat-message-form") do fill_in 'new-chat-message', with: msg end - find("[layout-id=\"panelChat\"] .chat-sender .btn-send-chat-message").trigger(:click) + find("[layout-id=\"panelChat\"] .chat-sender .btn-send-chat-message").click end def open_notifications - find("#{NOTIFICATION_PANEL} .panel-header").trigger(:click) + find("#{NOTIFICATION_PANEL} .panel-header").click end @@ -118,7 +118,7 @@ end # simulates focus event on window def window_focus - page.evaluate_script(%{window.jQuery(window).trigger('focus');}) + page.evaluate_script(%{window.jQuery(window).focus();}) end def close_websocket diff --git a/web/spec/support/utilities.rb b/web/spec/support/utilities.rb index b0e1569e6..be5bdc431 100644 --- a/web/spec/support/utilities.rb +++ b/web/spec/support/utilities.rb @@ -46,12 +46,12 @@ end # in place of ever using Capybara.session_name directly, # this utility is used to handle the mapping of session names in a way across all tests runs -def in_client(name) +def in_client(name, &blk) session_name = name.class == JamRuby::User ? name.id : name - Capybara.session_name = mapped_session_name(session_name) + #Capybara.session_name = mapped_session_name(session_name) - yield + Capybara.using_session(session_name, &blk) end