hyper-mesh 0.5.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile +7 -2
- data/README.md +112 -87
- data/Rakefile +6 -1
- data/docs/action_cable_quickstart.md +20 -16
- data/docs/activerecord_api.md +23 -17
- data/docs/authorization-policies.md +45 -35
- data/docs/client_side_scoping.md +5 -5
- data/docs/configuration_details.md +6 -46
- data/docs/pusher_faker_quickstart.md +7 -68
- data/docs/pusher_quickstart.md +7 -68
- data/docs/simple_poller_quickstart.md +6 -67
- data/docs/todo-example.md +2 -2
- data/docs/word_game.md +3 -1
- data/docs/words-example.md +2 -3
- data/examples/action-cable/Gemfile +2 -1
- data/examples/action-cable/Gemfile.lock +73 -54
- data/examples/action-cable/config/initializers/{hyper_mesh.rb → hyperloop.rb} +1 -1
- data/examples/action-cable/config/routes.rb +1 -1
- data/hyper-mesh.gemspec +10 -4
- data/lib/active_record_base.rb +3 -3
- data/{examples/action-cable-production-mode/log/.keep → lib/acts_as_string.rb} +0 -0
- data/lib/hyper-mesh.rb +11 -19
- data/lib/hyper_mesh/version.rb +3 -0
- data/lib/hypermesh/version.rb +1 -1
- data/lib/reactive_record/active_record/class_methods.rb +10 -3
- data/lib/reactive_record/active_record/instance_methods.rb +8 -0
- data/lib/reactive_record/active_record/public_columns_hash.rb +8 -2
- data/lib/reactive_record/active_record/reactive_record/collection.rb +0 -1
- data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +2 -1
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +55 -63
- data/lib/reactive_record/active_record/reactive_record/operations.rb +51 -0
- data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +3 -3
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +93 -84
- data/lib/reactive_record/broadcast.rb +183 -0
- data/lib/reactive_record/permissions.rb +2 -2
- data/reactive_record_test_app/Gemfile +6 -2
- data/reactive_record_test_app/Gemfile.lock +120 -60
- data/reactive_record_test_app/app/assets/javascripts/application.rb +3 -5
- data/reactive_record_test_app/app/assets/javascripts/bigdecimal.rb +1 -0
- data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +2 -2
- data/reactive_record_test_app/app/controllers/application_controller.rb +3 -3
- data/reactive_record_test_app/app/controllers/home_controller.rb +1 -1
- data/reactive_record_test_app/app/models/models.rb.erb +6 -0
- data/reactive_record_test_app/config/application.rb +2 -0
- data/reactive_record_test_app/config/environments/development.rb +1 -1
- data/reactive_record_test_app/config/routes.rb +1 -2
- data/reactive_record_test_app/db/seeds.rb +6 -0
- data/reactive_record_test_app/script/rails +0 -0
- data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +11 -2
- data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +3 -4
- data/reactive_record_test_app/spec-opal/spec_helper.js.rb +1 -1
- data/reactive_record_test_app/spec-opal/test_spec.rb +7 -0
- data/reactive_record_test_app/spec_dont_run/README.md +7 -0
- data/reactive_record_test_app/{spec-opal/active-record → spec_dont_run/active_record_broken}/permissions_spec.rb +0 -0
- data/reactive_record_test_app/{spec-opal/active-record → spec_dont_run/active_record_broken}/prerendering_spec.rb +1 -0
- data/spec/{synchromesh/aaa-unit_tests/connection_spec.rb → batch1/aaa-unit_tests/connection_movedspec.rb} +0 -0
- data/spec/{synchromesh → batch1}/aaa-unit_tests/dummy_value_spec.rb +2 -2
- data/spec/{synchromesh → batch1}/column_types/column_type_spec.rb +2 -2
- data/spec/{synchromesh → batch1}/crud_access_regulation/broadcast_controls_access_spec.rb +1 -1
- data/spec/{synchromesh → batch1}/crud_access_regulation/model_policies_spec.rb +6 -6
- data/spec/batch1/misc/access_like_hash_spec.rb +43 -0
- data/spec/batch1/misc/while_loading_spec.rb +196 -0
- data/spec/{synchromesh → batch1}/policies/regulate_all_broadcasts_spec.rb +12 -12
- data/spec/{synchromesh → batch1}/policies/regulate_broadcast_spec.rb +25 -25
- data/spec/{synchromesh/integration → batch2}/authorization_spec.rb +8 -7
- data/spec/{synchromesh/integration → batch2}/default_scope_spec.rb +2 -2
- data/spec/{synchromesh/integration → batch2}/has_many_through_spec.rb +2 -2
- data/spec/{synchromesh/integration → batch2}/relationships_spec.rb +3 -3
- data/spec/{reactive_record → batch3}/auto_load_itself_spec.rb +1 -1
- data/spec/{reactive_record → batch3}/edge_cases_spec.rb +1 -1
- data/spec/{reactive_record → batch3}/finder_method_spec.rb +1 -1
- data/spec/{reactive_record → batch3}/many_to_many_spec.rb +2 -2
- data/spec/{reactive_record → batch3}/pry_rescue_xspec.rb +0 -0
- data/{examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css → spec/batch3/readme.txt} +0 -0
- data/spec/{reactive_record → batch3}/revert_spec.rb +2 -2
- data/spec/{reactive_record → batch3}/save_while_loading_spec.rb +1 -1
- data/spec/{reactive_record → batch3}/update_associations_spec.rb +2 -2
- data/spec/{reactive_record → batch3}/update_scopes_spec.rb +2 -2
- data/spec/{synchromesh/integration → batch4}/saving_during_commit_spec.rb +2 -2
- data/spec/{synchromesh/integration → batch4}/scope_spec.rb +30 -2
- data/spec/{synchromesh/examples → batch4}/scoped_todos_spec.rb +3 -3
- data/spec/{synchromesh/integration → batch4}/synchromesh_spec.rb +2 -2
- data/spec/{synchromesh/examples → examples}/dictionary.rb +2 -2
- data/spec/{synchromesh/examples → examples}/dictionary_with_client_scopes.rb +2 -2
- data/spec/{synchromesh/examples → examples}/random_examples.rb +1 -1
- data/spec/{reactive_record/play.rb → play_ground.rb} +0 -0
- data/spec/{reactive_record/factory.rb → reactive_record_factory.rb} +0 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/test_app/Gemfile +8 -3
- data/spec/test_app/Gemfile.lock +114 -64
- data/spec/test_app/app/views/components.rb +1 -2
- data/spec/test_app/config/application.rb +2 -0
- data/spec/test_app/config/routes.rb +1 -1
- data/spec/{synchromesh/integration/test_components.rb → test_components.rb} +0 -0
- metadata +144 -137
- data/app/controllers/reactive_record/application_controller.rb +0 -4
- data/app/controllers/reactive_record/reactive_record_controller.rb +0 -49
- data/config/routes.rb +0 -7
- data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js +0 -50
- data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js.gz +0 -0
- data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz +0 -0
- data/examples/action-cable-production-mode/tmp/.keep +0 -0
- data/examples/action-cable/log/.keep +0 -0
- data/examples/action-cable/tmp/.keep +0 -0
- data/examples/pusher-fake/log/.keep +0 -0
- data/examples/pusher-fake/tmp/.keep +0 -0
- data/examples/pusher/log/.keep +0 -0
- data/examples/pusher/tmp/.keep +0 -0
- data/examples/simple-poller/log/.keep +0 -0
- data/examples/simple-poller/tmp/.keep +0 -0
- data/examples/word-game/log/.keep +0 -0
- data/examples/word-game/tmp/.keep +0 -0
- data/examples/words/log/.keep +0 -0
- data/examples/words/tmp/.keep +0 -0
- data/lib/reactive_record/version.rb +0 -3
- data/lib/sources/hyper-mesh/pusher.js +0 -98
- data/lib/synchromesh/action_cable.rb +0 -39
- data/lib/synchromesh/client_drivers.rb +0 -357
- data/lib/synchromesh/configuration.rb +0 -40
- data/lib/synchromesh/connection.rb +0 -170
- data/lib/synchromesh/policy.rb +0 -504
- data/lib/synchromesh/synchromesh.rb +0 -159
- data/lib/synchromesh/synchromesh_controller.rb +0 -162
- data/reactive_record_test_app/README.rdoc +0 -261
- data/reactive_record_test_app/app/assets/javascripts/components/another_component.rb +0 -24
- data/reactive_record_test_app/app/assets/javascripts/components/empty_component.rb +0 -6
- data/reactive_record_test_app/app/assets/javascripts/components/todo_item_component.js.rb +0 -16
- data/reactive_record_test_app/app/assets/javascripts/components/todos_component.js.rb +0 -42
- data/reactive_record_test_app/app/assets/javascripts/components/todos_main_component.rb +0 -49
- data/reactive_record_test_app/app/assets/javascripts/react_js_test_only.js +0 -21618
- data/reactive_record_test_app/app/assets/javascripts/spec/reactive_record_xspec.js.rb +0 -42
- data/reactive_record_test_app/app/controllers/test_controller.rb +0 -7
- data/reactive_record_test_app/app/mailers/.gitkeep +0 -0
- data/reactive_record_test_app/app/models/models.rb +0 -1
- data/reactive_record_test_app/app/policies/application_policy.rb +0 -5
- data/reactive_record_test_app/app/views/components.rb +0 -4
- data/reactive_record_test_app/app/views/components/test.rb +0 -18
- data/reactive_record_test_app/app/views/home/index.html.erb +0 -1
- data/reactive_record_test_app/app/views/layouts/application.html.erb +0 -17
- data/reactive_record_test_app/config/environments/production.rb +0 -70
- data/reactive_record_test_app/config/environments/test.rb +0 -41
- data/spec/synchromesh/integration/transports_spec.rb +0 -308
- data/spec/synchromesh/policies/auto_connect_spec.rb +0 -60
- data/spec/synchromesh/policies/auto_loader_spec.rb +0 -34
- data/spec/synchromesh/policies/policy_methods_spec.rb +0 -85
- data/spec/synchromesh/policies/regulate_class_connection_spec.rb +0 -50
- data/spec/synchromesh/policies/regulate_instance_connection_spec.rb +0 -66
- data/spec/test_app/log/.keep +0 -0
@@ -27,7 +27,7 @@ describe "simple record update and save" do
|
|
27
27
|
mitch = User.find_by_email("mitch@catprint.com")
|
28
28
|
mitch.first_name = "Mitchell"
|
29
29
|
expect(mitch.first_name).to eq("Mitchell")
|
30
|
-
end
|
30
|
+
end # TODO this was broken
|
31
31
|
|
32
32
|
it "and the attribute will be marked as changed"do
|
33
33
|
expect(User.find_by_email("mitch@catprint.com")).to be_changed
|
@@ -40,7 +40,7 @@ describe "simple record update and save" do
|
|
40
40
|
|
41
41
|
it "after saving changed? will be false" do
|
42
42
|
expect(User.find_by_email("mitch@catprint.com")).not_to be_changed
|
43
|
-
end
|
43
|
+
end # TODO this was broken
|
44
44
|
|
45
45
|
it "after saving saving? will be false" do
|
46
46
|
expect(User.find_by_email("mitch@catprint.com")).not_to be_saving
|
@@ -53,7 +53,7 @@ describe "simple record update and save" do
|
|
53
53
|
end.then do |first_name|
|
54
54
|
expect(first_name).to eq("Mitchell")
|
55
55
|
end
|
56
|
-
end
|
56
|
+
end # TODO this was broken
|
57
57
|
|
58
58
|
it "after saving within the block saving? will be false" do
|
59
59
|
mitchell = User.find_by_email("mitch@catprint.com")
|
@@ -121,5 +121,4 @@ describe "simple record update and save" do
|
|
121
121
|
expect(mitch).to be_changed
|
122
122
|
end
|
123
123
|
end
|
124
|
-
|
125
124
|
end
|
@@ -2,13 +2,13 @@ require 'opal'
|
|
2
2
|
require 'opal-rspec'
|
3
3
|
require 'reactive_record_config'
|
4
4
|
require 'react' #_js_test_only'
|
5
|
+
require 'hyper-operation'
|
5
6
|
require 'hyper-mesh'
|
6
7
|
require 'jquery'
|
7
8
|
require 'opal-jquery'
|
8
9
|
require 'jquery.cookie'
|
9
10
|
require 'models'
|
10
11
|
|
11
|
-
|
12
12
|
Document.ready? do
|
13
13
|
`$.cookie('acting_user', null, { path: '/' })`
|
14
14
|
Opal::RSpec::Runner.autorun rescue nil
|
@@ -24,3 +24,10 @@ the server updates properly, is the way to go.
|
|
24
24
|
|
25
25
|
Consult the existing specs in the spec/reactive_record directory and compare them to the
|
26
26
|
old style files stored in `reactive_record_test_app/test/spec_dont_run/moved_to_main_spec_dir`.
|
27
|
+
|
28
|
+
|
29
|
+
Note: Permissions is superceeded by a different set of tests in the main test spec directory
|
30
|
+
however the old tests are there in case somebody has a chance to go through and make sure
|
31
|
+
everything is covered.
|
32
|
+
|
33
|
+
Note: Prerendering has not been formally tested... Probably should be its just a bit difficult.
|
File without changes
|
@@ -8,6 +8,7 @@ describe "prerendering" do
|
|
8
8
|
expect(User.find_by_email("mitch@catprint.com").id).not_to eq(1)
|
9
9
|
end
|
10
10
|
|
11
|
+
# THIS IS FAILING BECAUSE WE ARE TRYING TO GRAB BROwSER DURING PRERENDERING
|
11
12
|
async "preloaded the records" do
|
12
13
|
`window.ClientSidePrerenderDataInterface.ReactiveRecordInitialData = undefined` rescue nil
|
13
14
|
container = Element[Document.body].append('<div></div>').children.last
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'test_components'
|
3
3
|
require 'rspec-steps'
|
4
4
|
|
5
5
|
describe "column types on client", js: true do
|
@@ -59,7 +59,7 @@ describe "column types on client", js: true do
|
|
59
59
|
Pusher.secret = "MY_TEST_SECRET"
|
60
60
|
require "pusher-fake/support/base"
|
61
61
|
|
62
|
-
|
62
|
+
Hyperloop.configuration do |config|
|
63
63
|
config.transport = :pusher
|
64
64
|
config.channel_prefix = "synchromesh"
|
65
65
|
config.opts = {app_id: Pusher.app_id, key: Pusher.key, secret: Pusher.secret}.merge(PusherFake.configuration.web_options)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'test_components'
|
3
3
|
|
4
4
|
describe "regulate access allowed" do
|
5
5
|
|
@@ -14,7 +14,7 @@ describe "regulate access allowed" do
|
|
14
14
|
after(:each) do
|
15
15
|
class ActiveRecord::Base
|
16
16
|
def view_permitted?(attribute)
|
17
|
-
|
17
|
+
Hyperloop::InternalPolicy.accessible_attributes_for(self, acting_user).include? attribute.to_sym
|
18
18
|
end
|
19
19
|
[:create, :update, :destroy].each do |access|
|
20
20
|
define_method("#{access}_permitted?".to_sym) { false }
|
@@ -22,7 +22,7 @@ describe "regulate access allowed" do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
Hyperloop::InternalClassPolicy::CHANGE_POLICIES.each do |policy|
|
26
26
|
|
27
27
|
it "will define a basic allow_#{policy} policy" do
|
28
28
|
stub_const 'DummyModelPolicy', Class.new
|
@@ -60,7 +60,7 @@ describe "regulate access allowed" do
|
|
60
60
|
DummyModelPolicy.class_eval do
|
61
61
|
send("allow_change") { "called change" }
|
62
62
|
end
|
63
|
-
|
63
|
+
Hyperloop::InternalClassPolicy::CHANGE_POLICIES.each do |policy|
|
64
64
|
DummyModel.new.send("#{policy}_permitted?").should eq("called change")
|
65
65
|
end
|
66
66
|
end
|
@@ -70,7 +70,7 @@ describe "regulate access allowed" do
|
|
70
70
|
ApplicationPolicy.class_eval do
|
71
71
|
send("allow_change", DummyModel) { "called change" }
|
72
72
|
end
|
73
|
-
|
73
|
+
Hyperloop::InternalClassPolicy::CHANGE_POLICIES.each do |policy|
|
74
74
|
DummyModel.new.send("#{policy}_permitted?").should eq("called change")
|
75
75
|
end
|
76
76
|
end
|
@@ -84,7 +84,7 @@ describe "regulate access allowed" do
|
|
84
84
|
FooModel.class_eval do
|
85
85
|
self.table_name = 'test_models'
|
86
86
|
end
|
87
|
-
|
87
|
+
Hyperloop::InternalClassPolicy::CHANGE_POLICIES.each do |policy|
|
88
88
|
DummyModel.new.send("#{policy}_permitted?").should eq("called change on DummyModel")
|
89
89
|
FooModel.new.send("#{policy}_permitted?").should eq("called change on FooModel")
|
90
90
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_components'
|
3
|
+
require 'rspec-steps'
|
4
|
+
|
5
|
+
|
6
|
+
RSpec::Steps.steps "access like a hash", js: true do
|
7
|
+
|
8
|
+
before(:step) do
|
9
|
+
# spec_helper resets the policy system after each test so we have to setup
|
10
|
+
# before each test
|
11
|
+
stub_const 'TestApplication', Class.new
|
12
|
+
stub_const 'TestApplicationPolicy', Class.new
|
13
|
+
TestApplicationPolicy.class_eval do
|
14
|
+
always_allow_connection
|
15
|
+
regulate_all_broadcasts { |policy| policy.send_all }
|
16
|
+
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
17
|
+
end
|
18
|
+
size_window(:small, :portrait)
|
19
|
+
FactoryGirl.create(:user, first_name: 'Lily', last_name: 'DaDog')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can access attributes using the [] operator" do
|
23
|
+
expect_promise do
|
24
|
+
HyperMesh.load do
|
25
|
+
User.find_by_first_name('Lily')
|
26
|
+
end.then do |lily|
|
27
|
+
lily[:first_name]
|
28
|
+
end
|
29
|
+
end.to eq('Lily')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can update attributes using the []= operator" do
|
33
|
+
expect_promise do
|
34
|
+
HyperMesh.load do
|
35
|
+
User.find_by_first_name('Lily')
|
36
|
+
end.then do |lily|
|
37
|
+
lily[:last_name] = 'DerDog'
|
38
|
+
lily.save
|
39
|
+
end
|
40
|
+
end.to be_truthy
|
41
|
+
expect(User.find_by_first_name('Lily')[:last_name]).to eq('DerDog')
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_components'
|
3
|
+
require 'rspec-steps'
|
4
|
+
|
5
|
+
|
6
|
+
describe "while loading", js: true do
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
class ReactiveRecord::Operations::Fetch < Hyperloop::ServerOp
|
10
|
+
def self.semaphore
|
11
|
+
@semaphore ||= Mutex.new
|
12
|
+
end
|
13
|
+
validate { self.class.semaphore.synchronize { true } }
|
14
|
+
end
|
15
|
+
require 'pusher'
|
16
|
+
require 'pusher-fake'
|
17
|
+
Pusher.app_id = "MY_TEST_ID"
|
18
|
+
Pusher.key = "MY_TEST_KEY"
|
19
|
+
Pusher.secret = "MY_TEST_SECRET"
|
20
|
+
require "pusher-fake/support/base"
|
21
|
+
|
22
|
+
Hyperloop.configuration do |config|
|
23
|
+
config.transport = :pusher
|
24
|
+
config.channel_prefix = "synchromesh"
|
25
|
+
config.opts = {app_id: Pusher.app_id, key: Pusher.key, secret: Pusher.secret}.merge(PusherFake.configuration.web_options)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
before(:each) do
|
29
|
+
# spec_helper resets the policy system after each test so we have to setup
|
30
|
+
# before each test
|
31
|
+
stub_const 'TestApplication', Class.new
|
32
|
+
stub_const 'TestApplicationPolicy', Class.new
|
33
|
+
TestApplicationPolicy.class_eval do
|
34
|
+
always_allow_connection
|
35
|
+
regulate_all_broadcasts { |policy| policy.send_all }
|
36
|
+
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
37
|
+
end
|
38
|
+
size_window(:small, :portrait)
|
39
|
+
FactoryGirl.create(:user, first_name: 'Lily', last_name: 'DaDog')
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
it "will display the while loading message" do
|
44
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
45
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
46
|
+
class MyNestedGuy < Hyperloop::Component
|
47
|
+
render(SPAN) do
|
48
|
+
User.find_by_first_name('Lily').last_name
|
49
|
+
end
|
50
|
+
end
|
51
|
+
class WhileLoadingTester < Hyperloop::Component
|
52
|
+
render do
|
53
|
+
DIV do
|
54
|
+
MyNestedGuy {}
|
55
|
+
end.while_loading do
|
56
|
+
SPAN { 'loading...' }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
expect(page).to have_content('loading...')
|
62
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
63
|
+
end
|
64
|
+
expect(page).to have_content('DaDog')
|
65
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "loading and loaded blocks can return strings" do
|
69
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
70
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
71
|
+
class WhileLoadingTester < Hyperloop::Component
|
72
|
+
render do
|
73
|
+
DIV do
|
74
|
+
User.find_by_first_name('Lily').last_name
|
75
|
+
end.while_loading do
|
76
|
+
'loading...'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
expect(page).to have_content('loading...')
|
82
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
83
|
+
sleep 1
|
84
|
+
end
|
85
|
+
expect(page).to have_content('DaDog')
|
86
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
87
|
+
sleep 1
|
88
|
+
end
|
89
|
+
|
90
|
+
it "The inner most while_loading will display only" do
|
91
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
92
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
93
|
+
class MyNestedGuy < Hyperloop::Component
|
94
|
+
render do
|
95
|
+
DIV { User.find_by_first_name('Lily').last_name }
|
96
|
+
.while_loading { SPAN { 'loading...' } }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
class WhileLoadingTester < Hyperloop::Component
|
100
|
+
render do
|
101
|
+
DIV do
|
102
|
+
MyNestedGuy {}
|
103
|
+
end.while_loading do
|
104
|
+
SPAN { 'i should not display' }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
expect(page).to have_content('loading...')
|
110
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
111
|
+
end
|
112
|
+
expect(page).to have_content('DaDog')
|
113
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "while loading can take a string param instead of a block" do
|
117
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
118
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
119
|
+
class WhileLoadingTester < Hyperloop::Component
|
120
|
+
render do
|
121
|
+
DIV do
|
122
|
+
User.find_by_first_name('Lily').last_name
|
123
|
+
end
|
124
|
+
.while_loading 'loading...'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
expect(page).to have_content('loading...')
|
129
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
130
|
+
end
|
131
|
+
expect(page).to have_content('DaDog')
|
132
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "while loading can take an element param instead of a block" do
|
136
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
137
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
138
|
+
class WhileLoadingTester < Hyperloop::Component
|
139
|
+
render do
|
140
|
+
DIV do
|
141
|
+
User.find_by_first_name('Lily').last_name
|
142
|
+
end
|
143
|
+
.while_loading(DIV { 'loading...' })
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
expect(page).to have_content('loading...')
|
148
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
149
|
+
end
|
150
|
+
expect(page).to have_content('DaDog')
|
151
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "will display the while loading message" do
|
155
|
+
isomorphic do
|
156
|
+
class FetchNow < Hyperloop::ServerOp
|
157
|
+
dispatch_to { TestApplication }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
mount "WhileLoadingTester", {}, no_wait: true do
|
161
|
+
class MyNestedGuy < Hyperloop::Component
|
162
|
+
state fetch: false, scope: :shared
|
163
|
+
FetchNow.on_dispatch { mutate.fetch(true) }
|
164
|
+
render(SPAN) do
|
165
|
+
if state.fetch
|
166
|
+
User.find_by_first_name('Lily').last_name
|
167
|
+
else
|
168
|
+
'no fetch yet chet'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
class WhileLoadingTester < Hyperloop::Component
|
173
|
+
render do
|
174
|
+
DIV do
|
175
|
+
MyNestedGuy {}
|
176
|
+
end.while_loading do
|
177
|
+
SPAN { 'loading...' }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
expect(page).to have_content('no fetch yet chet')
|
183
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
184
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
185
|
+
ReactiveRecord::Operations::Fetch.semaphore.synchronize do
|
186
|
+
FetchNow.run
|
187
|
+
expect(page).to have_content('loading...')
|
188
|
+
expect(page).not_to have_content('DaDog', wait: 0)
|
189
|
+
expect(page).not_to have_content('no fetch yet chet', wait: 0)
|
190
|
+
end
|
191
|
+
expect(page).to have_content('DaDog')
|
192
|
+
expect(page).not_to have_content('loading...', wait: 0)
|
193
|
+
expect(page).not_to have_content('no fetch yet chet', wait: 0)
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
@@ -31,8 +31,8 @@ describe "regulate_all_broadcasts" do
|
|
31
31
|
end
|
32
32
|
attr_accessor :attrA, :attrB, :attrC, :attrD, :attrE
|
33
33
|
end
|
34
|
-
allow_any_instance_of(
|
35
|
-
allow(
|
34
|
+
allow_any_instance_of(Hyperloop::InternalPolicy).to receive(:id).and_return(:unique_broadcast_id)
|
35
|
+
allow(Hyperloop::Connection).to receive(:active).and_return(['Application', 'AnotherApplication', 'Class1', 'Class2'])
|
36
36
|
end
|
37
37
|
|
38
38
|
it "will broadcast to a single channel" do
|
@@ -43,7 +43,7 @@ describe "regulate_all_broadcasts" do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
46
|
-
expect { |b|
|
46
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
47
47
|
{
|
48
48
|
broadcast_id: :unique_broadcast_id,
|
49
49
|
channel: 'Application',
|
@@ -69,7 +69,7 @@ describe "regulate_all_broadcasts" do
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
72
|
-
expect { |b|
|
72
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
73
73
|
{
|
74
74
|
broadcast_id: :unique_broadcast_id,
|
75
75
|
channel: 'Application',
|
@@ -103,7 +103,7 @@ describe "regulate_all_broadcasts" do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
106
|
-
expect { |b|
|
106
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
107
107
|
{
|
108
108
|
broadcast_id: :unique_broadcast_id,
|
109
109
|
channel: 'Application',
|
@@ -139,7 +139,7 @@ describe "regulate_all_broadcasts" do
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
142
|
-
expect { |b|
|
142
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
143
143
|
{
|
144
144
|
broadcast_id: :unique_broadcast_id,
|
145
145
|
channel: 'AnotherApplication',
|
@@ -175,7 +175,7 @@ describe "regulate_all_broadcasts" do
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
178
|
-
expect { |b|
|
178
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
179
179
|
{
|
180
180
|
broadcast_id: :unique_broadcast_id,
|
181
181
|
channel: 'AnotherApplication',
|
@@ -212,7 +212,7 @@ describe "regulate_all_broadcasts" do
|
|
212
212
|
end
|
213
213
|
end
|
214
214
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
215
|
-
expect { |b|
|
215
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
216
216
|
{
|
217
217
|
broadcast_id: :unique_broadcast_id,
|
218
218
|
channel: 'AnotherApplication',
|
@@ -241,7 +241,7 @@ describe "regulate_all_broadcasts" do
|
|
241
241
|
end
|
242
242
|
end
|
243
243
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
244
|
-
expect { |b|
|
244
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
245
245
|
{
|
246
246
|
broadcast_id: :unique_broadcast_id,
|
247
247
|
channel: 'Application',
|
@@ -261,7 +261,7 @@ describe "regulate_all_broadcasts" do
|
|
261
261
|
end
|
262
262
|
end
|
263
263
|
model = TestModel1.new(attr1: 1)
|
264
|
-
expect { |b|
|
264
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
265
265
|
{
|
266
266
|
broadcast_id: :unique_broadcast_id,
|
267
267
|
channel: 'Application',
|
@@ -272,7 +272,7 @@ describe "regulate_all_broadcasts" do
|
|
272
272
|
}
|
273
273
|
)
|
274
274
|
model = TestModel2.new(attrA: "A")
|
275
|
-
expect { |b|
|
275
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
276
276
|
{
|
277
277
|
broadcast_id: :unique_broadcast_id,
|
278
278
|
channel: 'Application',
|
@@ -293,7 +293,7 @@ describe "regulate_all_broadcasts" do
|
|
293
293
|
end
|
294
294
|
end
|
295
295
|
model = TestModel1.new(attr1: 1, attr2: 2, attr3: 3, attr4: 4, attr5: 5)
|
296
|
-
expect { |b|
|
296
|
+
expect { |b| Hyperloop::InternalPolicy.regulate_broadcast(model, &b) }.to yield_successive_args(
|
297
297
|
{
|
298
298
|
broadcast_id: :unique_broadcast_id,
|
299
299
|
channel: 'Class1',
|