capybara-angular 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 693dad6d8c4ff820c47a41b26d0c680179148256
4
- data.tar.gz: 72e6b43dbe008965532ddc18b864476c37f50d60
3
+ metadata.gz: 07bb2276413ff6990ca7a585e2466bbbaeac3f55
4
+ data.tar.gz: 46be6bbca846bd8e3724a601b996fc02838c6d35
5
5
  SHA512:
6
- metadata.gz: a2960689f9869d6a45f269a49d60e8b6d3c42e98740b5e64a14acc029b2bdebe2dea0b5c25e9f2cf311ca5391ea71d500ea14a3364dee66ba311f4c490d3b814
7
- data.tar.gz: 325b2b29a1741e706cd361bc8235bff5d1cd8f8cf2dd3accbf2c8a43ad83e58fa0968400cec6fb4431862c9d6062b35bd5dbae1ede3f9b166fdec3704256991d
6
+ metadata.gz: f8141edfd0b75ff1256cc2236dc4547dbc66bd8747434ff3aebc701e40c26aa68047b88ebb0c03aaa2503570ec26444d61fe91f427aa4894845026df0feafd49
7
+ data.tar.gz: a31a4525de002d97cd9402c28dc2314d50bf6f0cabe96b85780bf7d2a98952a5df11afe8567df5cc1a45404390c407de77062aea08e79653e153bdb6cf8a583f
data/README.md CHANGED
@@ -18,6 +18,13 @@ Use it as you would use regular Capybara API, however this time, you won't face
18
18
  include Capybara::Angular::DSL
19
19
  ```
20
20
 
21
+ If you need to run some code without caring about AngularJS, you can use `ignoring_angular` like this:
22
+ ```ruby
23
+ ignoring_angular do
24
+ # Your AngularJS agnostic code goes here
25
+ end
26
+ ```
27
+
21
28
  ## Limitations
22
29
 
23
30
  At the moment it works with AngularJS applications initialized with `ng-app`.
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec"
26
26
  spec.add_development_dependency "poltergeist"
27
+ spec.add_development_dependency "puma"
27
28
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Angular
3
- VERSION = "0.2.5"
3
+ VERSION = "0.2.6"
4
4
  end
5
5
  end
@@ -0,0 +1,53 @@
1
+ // This script is injected from waiter.rb. It is responsible for setting
2
+ // window.capybaraAngularReady when either a) angular is ready, or b)
3
+ // it determines the page is not an angular page.
4
+
5
+ (function () {
6
+ "use strict";
7
+
8
+ window.capybaraAngularReady = false;
9
+
10
+ function ready() {
11
+ window.capybaraAngularReady = true;
12
+ }
13
+
14
+ function angularPresent() {
15
+ return window.angular !== undefined;
16
+ }
17
+
18
+ function element() {
19
+ return document.querySelector("[ng-app], [data-ng-app]") || document.querySelector("body");
20
+ }
21
+
22
+ function elementPresent() {
23
+ return element() !== undefined;
24
+ }
25
+
26
+ function setupTestability() {
27
+ try {
28
+ angular.getTestability(element()).whenStable(ready);
29
+ } catch (err) {
30
+ ready();
31
+ }
32
+ }
33
+
34
+ function setupInjector() {
35
+ try {
36
+ angular.element(element()).injector().get("$browser").notifyWhenNoOutstandingRequests(ready);
37
+ } catch (err) {
38
+ ready();
39
+ }
40
+ }
41
+
42
+ function setup() {
43
+ if (!angularPresent() || !elementPresent()) {
44
+ ready();
45
+ } else if (angular.getTestability) {
46
+ setupTestability();
47
+ } else {
48
+ setupInjector();
49
+ }
50
+ }
51
+
52
+ setup();
53
+ }());
@@ -1,6 +1,8 @@
1
1
  module Capybara
2
2
  module Angular
3
3
  class Waiter
4
+ WAITER_JS = IO.read(File.expand_path "../waiter.js", __FILE__)
5
+
4
6
  attr_accessor :page
5
7
 
6
8
  def initialize(page)
@@ -8,23 +10,24 @@ module Capybara
8
10
  end
9
11
 
10
12
  def wait_until_ready
11
- return unless angular_app?
12
-
13
- setup_ready
14
-
13
+ return unless driver_supports_js?
15
14
  start = Time.now
15
+
16
16
  until ready?
17
+ inject_waiter
17
18
  timeout! if timeout?(start)
18
- if page_reloaded_on_wait?
19
- return unless angular_app?
20
- setup_ready
21
- end
22
19
  sleep(0.01)
23
20
  end
24
21
  end
25
22
 
26
23
  private
27
24
 
25
+ def driver_supports_js?
26
+ page.evaluate_script "true"
27
+ rescue Capybara::NotSupportedByDriverError
28
+ false
29
+ end
30
+
28
31
  def timeout?(start)
29
32
  Time.now - start > Capybara::Angular.default_max_wait_time
30
33
  end
@@ -33,37 +36,13 @@ module Capybara
33
36
  raise Timeout::Error.new("timeout while waiting for angular")
34
37
  end
35
38
 
36
- def ready?
37
- page.evaluate_script("window.angularReady")
38
- end
39
-
40
- def angular_app?
41
- js = '!!window.angular'
42
- page.evaluate_script js
43
-
44
- rescue Capybara::NotSupportedByDriverError
45
- false
46
- end
47
-
48
- def setup_ready
49
- page.execute_script <<-JS
50
- var el = document.querySelector('[ng-app], [data-ng-app]') || document.querySelector('body');
51
-
52
- window.angularReady = false;
53
-
54
- if (angular.getTestability) {
55
- angular.getTestability(el).whenStable(function() { window.angularReady = true; });
56
- } else {
57
- var $browser = angular.element(el).injector().get('$browser');
58
-
59
- if ($browser.outstandingRequestCount > 0) { window.angularReady = false; }
60
- $browser.notifyWhenNoOutstandingRequests(function() { window.angularReady = true; });
61
- }
62
- JS
39
+ def inject_waiter
40
+ return if page.evaluate_script("window.capybaraAngularReady !== undefined")
41
+ page.execute_script WAITER_JS
63
42
  end
64
43
 
65
- def page_reloaded_on_wait?
66
- page.evaluate_script("window.angularReady === undefined")
44
+ def ready?
45
+ page.evaluate_script("window.capybaraAngularReady === true")
67
46
  end
68
47
  end
69
48
  end
@@ -27,6 +27,16 @@ feature 'Waiting for angular' do
27
27
  timeout_page_should_have_waited
28
28
  end
29
29
 
30
+ scenario 'when visiting a non-angular page' do
31
+ open_non_angular_page
32
+ non_angular_page_should_load
33
+ end
34
+
35
+ scenario 'when visiting a non-angular page that loads angular javascript' do
36
+ open_non_angular_page_with_angular_javascript
37
+ non_angular_page_should_load
38
+ end
39
+
30
40
  def open_manual_bootstrap_page
31
41
  visit '/manual.html'
32
42
  end
@@ -39,7 +49,19 @@ feature 'Waiting for angular' do
39
49
  visit '/ng-app-not-on-body.html'
40
50
  end
41
51
 
52
+ def open_non_angular_page
53
+ visit '/non-angular-page.html'
54
+ end
55
+
56
+ def open_non_angular_page_with_angular_javascript
57
+ visit '/non-angular-page-with-angular-javascript.html'
58
+ end
59
+
42
60
  def timeout_page_should_have_waited
43
61
  expect(page).to have_content('waited')
44
62
  end
63
+
64
+ def non_angular_page_should_load
65
+ expect(page).to have_content('non-angular page')
66
+ end
45
67
  end
@@ -0,0 +1,8 @@
1
+ <html>
2
+ <head>
3
+ <script src="/js/angular-1.5.8.js"></script>
4
+ </head>
5
+ <body>
6
+ non-angular page
7
+ </body>
8
+ </html>
@@ -0,0 +1,6 @@
1
+ <html>
2
+ <head/>
3
+ <body>
4
+ non-angular page
5
+ </body>
6
+ </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-angular
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pawel Pierzchala
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-10 00:00:00.000000000 Z
11
+ date: 2018-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: puma
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Capybara API that knows how to wait for Angular in end to end specs
84
98
  email:
85
99
  - pawelpierzchala@gmail.com
@@ -97,6 +111,7 @@ files:
97
111
  - lib/capybara/angular.rb
98
112
  - lib/capybara/angular/dsl.rb
99
113
  - lib/capybara/angular/version.rb
114
+ - lib/capybara/angular/waiter.js
100
115
  - lib/capybara/angular/waiter.rb
101
116
  - spec/capybara/angular_spec.rb
102
117
  - spec/public/js/angular-1.5.8.js
@@ -104,6 +119,8 @@ files:
104
119
  - spec/public/manual.html
105
120
  - spec/public/ng-app-not-on-body.html
106
121
  - spec/public/ng-app.html
122
+ - spec/public/non-angular-page-with-angular-javascript.html
123
+ - spec/public/non-angular-page.html
107
124
  homepage: ''
108
125
  licenses:
109
126
  - MIT
@@ -124,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
141
  version: '0'
125
142
  requirements: []
126
143
  rubyforge_project:
127
- rubygems_version: 2.6.8
144
+ rubygems_version: 2.6.12
128
145
  signing_key:
129
146
  specification_version: 4
130
147
  summary: Stable Capybara API for AngularJS applications
@@ -135,3 +152,5 @@ test_files:
135
152
  - spec/public/manual.html
136
153
  - spec/public/ng-app-not-on-body.html
137
154
  - spec/public/ng-app.html
155
+ - spec/public/non-angular-page-with-angular-javascript.html
156
+ - spec/public/non-angular-page.html