janus-cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -1
- data/CHANGELOG.md +7 -0
- data/Guardfile +2 -2
- data/README.md +11 -20
- data/Rakefile +11 -1
- data/bin/janus +1 -1
- data/janus.gemspec +3 -1
- data/lib/janus.rb +0 -1
- data/lib/janus/browser.rb +19 -0
- data/lib/janus/command/record.rb +35 -4
- data/lib/janus/command/validate.rb +39 -5
- data/lib/janus/configuration.rb +21 -2
- data/lib/janus/core/engine.rb +26 -0
- data/lib/janus/core/error.rb +6 -0
- data/lib/janus/core/rule.rb +46 -0
- data/lib/janus/io/directory.rb +40 -0
- data/lib/janus/io/selenium.rb +43 -0
- data/lib/janus/screenshot.rb +7 -27
- data/lib/janus/version.rb +1 -1
- data/spec/integration/engine_spec.rb +50 -0
- data/spec/support/square-base.png +0 -0
- data/spec/support/square-big.png +0 -0
- data/spec/support/square-ten.png +0 -0
- data/spec/support/square-thirty.png +0 -0
- data/spec/support/square-twenty.png +0 -0
- data/spec/unit/janus/browser_spec.rb +57 -0
- data/spec/{janus → unit/janus}/command/initialize_spec.rb +1 -1
- data/spec/unit/janus/command/record_spec.rb +93 -0
- data/spec/unit/janus/command/validate_spec.rb +105 -0
- data/spec/{janus → unit/janus}/configuration_spec.rb +42 -0
- data/spec/unit/janus/core/engine_spec.rb +36 -0
- data/spec/unit/janus/core/error_spec.rb +4 -0
- data/spec/unit/janus/core/rule_spec.rb +65 -0
- data/spec/unit/janus/io/directory_spec.rb +83 -0
- data/spec/unit/janus/io/selenium_spec.rb +78 -0
- data/spec/unit/janus/screenshot_spec.rb +26 -0
- data/spec/{janus → unit/janus}/test_spec.rb +0 -0
- data/spec/{spec_helper.rb → unit/spec_helper.rb} +0 -0
- metadata +78 -19
- data/spec/janus/command/record_spec.rb +0 -36
- data/spec/janus/command/validate_spec.rb +0 -44
- data/spec/janus/screenshot_spec.rb +0 -79
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'janus/core/engine'
|
2
|
+
require 'janus/core/rule'
|
3
|
+
|
4
|
+
describe Janus::Core::Engine do
|
5
|
+
describe '::create' do
|
6
|
+
let(:config) { double }
|
7
|
+
let(:engine) { double }
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
Janus::Core::Engine.stub(:new) { engine }
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'creates engine with rules' do
|
14
|
+
engine.should_receive(:add_rule).with(an_instance_of(Janus::Core::DimensionsRule)).ordered
|
15
|
+
engine.should_receive(:add_rule).with(an_instance_of(Janus::Core::ThresholdRule)).ordered
|
16
|
+
|
17
|
+
Janus::Core::Engine.create(config)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#execute' do
|
22
|
+
let(:rule) { double }
|
23
|
+
let(:original) { double }
|
24
|
+
let(:fresh) { double }
|
25
|
+
|
26
|
+
it 'executes each rule' do
|
27
|
+
rule.should_receive(:execute).exactly(3).times
|
28
|
+
|
29
|
+
subject.add_rule(rule)
|
30
|
+
subject.add_rule(rule)
|
31
|
+
subject.add_rule(rule)
|
32
|
+
|
33
|
+
subject.execute(original, fresh)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'oily_png'
|
2
|
+
require 'janus/core/rule'
|
3
|
+
|
4
|
+
describe Janus::Core::DimensionsRule do
|
5
|
+
subject { Janus::Core::DimensionsRule.new(configuration) }
|
6
|
+
|
7
|
+
let(:original) { double }
|
8
|
+
let(:fresh) { double }
|
9
|
+
let(:configuration) do
|
10
|
+
configuration = double
|
11
|
+
configuration.stub(:threshold) { 0.5 }
|
12
|
+
configuration
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#execute' do
|
16
|
+
it 'does not raise exception when dimensions are the same' do
|
17
|
+
original.stub(:dimensions) { { width: 100, height: 100 } }
|
18
|
+
fresh.stub(:dimensions) { { width: 100, height: 100 } }
|
19
|
+
|
20
|
+
expect { subject.execute(original, fresh) }.not_to raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'raises exception when dimensions are different' do
|
24
|
+
original.stub(:dimensions) { { width: 100, height: 100 } }
|
25
|
+
fresh.stub(:dimensions) { { width: 100, height: 200 } }
|
26
|
+
|
27
|
+
expect { subject.execute(original, fresh) }.to raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe Janus::Core::ThresholdRule do
|
33
|
+
subject { Janus::Core::ThresholdRule.new(configuration) }
|
34
|
+
|
35
|
+
let(:original) { double }
|
36
|
+
let(:fresh) { double }
|
37
|
+
let(:configuration) do
|
38
|
+
configuration = double
|
39
|
+
configuration.stub(:threshold) { 0.5 }
|
40
|
+
configuration
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#execute' do
|
44
|
+
it 'does not raise exception when difference is below threshold' do
|
45
|
+
original.stub(:pixels) { [ChunkyPNG::Color::WHITE, ChunkyPNG::Color::WHITE] }
|
46
|
+
fresh.stub(:pixels) { [ChunkyPNG::Color::WHITE, ChunkyPNG::Color::WHITE] }
|
47
|
+
|
48
|
+
expect { subject.execute(original, fresh) }.not_to raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'does not raise exception when difference equals threshold' do
|
52
|
+
original.stub(:pixels) { [ChunkyPNG::Color::WHITE, ChunkyPNG::Color::WHITE] }
|
53
|
+
fresh.stub(:pixels) { [ChunkyPNG::Color::WHITE, ChunkyPNG::Color::BLACK] }
|
54
|
+
|
55
|
+
expect { subject.execute(original, fresh) }.not_to raise_error
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'raises exception when difference exceeds threshold' do
|
59
|
+
original.stub(:pixels) { [ChunkyPNG::Color::WHITE, ChunkyPNG::Color::WHITE] }
|
60
|
+
fresh.stub(:pixels) { [ChunkyPNG::Color::BLACK, ChunkyPNG::Color::BLACK] }
|
61
|
+
|
62
|
+
expect { subject.execute(original, fresh) }.to raise_error
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'janus/io/directory'
|
2
|
+
|
3
|
+
describe Janus::IO::Directory do
|
4
|
+
let(:directory) { 'base' }
|
5
|
+
|
6
|
+
let(:browser) do
|
7
|
+
browser = double
|
8
|
+
browser.stub(:platform) { 'platform' }
|
9
|
+
browser.stub(:name) { 'name' }
|
10
|
+
browser.stub(:version) { nil }
|
11
|
+
browser
|
12
|
+
end
|
13
|
+
|
14
|
+
# TODO: Builder
|
15
|
+
let(:test) do
|
16
|
+
test = double
|
17
|
+
test.stub(:name) { 'my test' }
|
18
|
+
test
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:io) { Janus::IO::Directory.new(directory, browser) }
|
22
|
+
|
23
|
+
describe '#read' do
|
24
|
+
it 'loads screenshot from disk for browser with version' do
|
25
|
+
browser.stub(:version) { 'version' }
|
26
|
+
|
27
|
+
ChunkyPNG::Image.should_receive(:from_file).with('base/my test.janus/platform-name-version.png') { 'my image' }
|
28
|
+
|
29
|
+
screenshot = io.read(test)
|
30
|
+
screenshot.image.should == 'my image'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'loads screenshot from disk for browser without version' do
|
34
|
+
ChunkyPNG::Image.should_receive(:from_file).with('base/my test.janus/platform-name.png') { 'my image' }
|
35
|
+
|
36
|
+
screenshot = io.read(test)
|
37
|
+
screenshot.image.should == 'my image'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#write' do
|
42
|
+
# TODO: Builder
|
43
|
+
let(:image) do
|
44
|
+
image = double
|
45
|
+
image.stub(:save)
|
46
|
+
image
|
47
|
+
end
|
48
|
+
|
49
|
+
let(:screenshot) { Janus::Screenshot.new(image) }
|
50
|
+
|
51
|
+
before :each do
|
52
|
+
FileUtils.stub(:mkpath)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'creates directory if it does not exist' do
|
56
|
+
Dir.should_receive(:exists?) { false }
|
57
|
+
FileUtils.should_receive(:mkpath).with('base/my test.janus')
|
58
|
+
|
59
|
+
io.write(test, screenshot)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'does not create directory if it already exists' do
|
63
|
+
Dir.should_receive(:exists?) { true }
|
64
|
+
FileUtils.should_not_receive(:mkpath)
|
65
|
+
|
66
|
+
io.write(test, screenshot)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'writes screenshot with version to disk' do
|
70
|
+
browser.stub(:version) { 'version' }
|
71
|
+
|
72
|
+
image.should_receive(:save).with('base/my test.janus/platform-name-version.png')
|
73
|
+
|
74
|
+
io.write(test, screenshot)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'writes screenshot without version to disk' do
|
78
|
+
image.should_receive(:save).with('base/my test.janus/platform-name.png')
|
79
|
+
|
80
|
+
io.write(test, screenshot)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'janus/test'
|
2
|
+
require 'janus/io/selenium'
|
3
|
+
|
4
|
+
describe Janus::IO::Selenium do
|
5
|
+
let(:image) { double }
|
6
|
+
|
7
|
+
let(:driver) do
|
8
|
+
driver = double
|
9
|
+
driver.stub(:get)
|
10
|
+
driver.stub(:screenshot_as)
|
11
|
+
driver
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:config) do
|
15
|
+
config = double
|
16
|
+
config.stub(:username) { 'username' }
|
17
|
+
config.stub(:access_key) { 'key' }
|
18
|
+
config
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:test) do
|
22
|
+
test = double
|
23
|
+
test.stub(:url) { 'this is my url' }
|
24
|
+
test
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:browser) do
|
28
|
+
browser = double
|
29
|
+
browser.stub(:platform) { 'platform' }
|
30
|
+
browser.stub(:name) { 'name' }
|
31
|
+
browser.stub(:version) { 'version' }
|
32
|
+
browser
|
33
|
+
end
|
34
|
+
|
35
|
+
before :each do
|
36
|
+
ChunkyPNG::Image::stub(:from_blob) { image }
|
37
|
+
Selenium::WebDriver.stub(:for) { driver }
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'builds Selenium driver with provided credentials for new capabilities' do
|
41
|
+
Selenium::WebDriver.should_receive(:for).with(:remote, {
|
42
|
+
url: "http://username:key@ondemand.saucelabs.com/wd/hub",
|
43
|
+
desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(
|
44
|
+
platform: browser.platform,
|
45
|
+
browser_name: browser.name,
|
46
|
+
version: browser.version
|
47
|
+
)
|
48
|
+
})
|
49
|
+
|
50
|
+
Janus::IO::Selenium.new('username', 'key', browser)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 're-uses Selenium driver with provided credentials for existing capabilities' do
|
54
|
+
Janus::IO::Selenium.new('username', 'key', browser)
|
55
|
+
|
56
|
+
Selenium::WebDriver.should_not_receive(:for)
|
57
|
+
|
58
|
+
Janus::IO::Selenium.new('username', 'key', browser)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'navigates to the provided URL' do
|
62
|
+
driver.should_receive(:get).with('this is my url')
|
63
|
+
|
64
|
+
io = Janus::IO::Selenium.new('username', 'key', browser)
|
65
|
+
io.read(test)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'creates image from PNG data' do
|
69
|
+
blob = double
|
70
|
+
driver.should_receive(:screenshot_as).with(:png) { blob }
|
71
|
+
ChunkyPNG::Image.should_receive(:from_blob).with(blob) { image }
|
72
|
+
|
73
|
+
io = Janus::IO::Selenium.new('username', 'key', browser)
|
74
|
+
|
75
|
+
screenshot = io.read(test)
|
76
|
+
screenshot.image.should == image
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'janus/screenshot'
|
2
|
+
|
3
|
+
describe Janus::Screenshot do
|
4
|
+
let(:image) { double }
|
5
|
+
|
6
|
+
describe '#dimensions' do
|
7
|
+
it 'returns dimensions of image' do
|
8
|
+
image.should_receive(:width) { 100 }
|
9
|
+
image.should_receive(:height) { 200 }
|
10
|
+
|
11
|
+
screenshot = Janus::Screenshot.new(image)
|
12
|
+
screenshot.dimensions.should == { width: 100, height: 200 }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#pixels' do
|
17
|
+
it 'returns pixels of image' do
|
18
|
+
pixels = double
|
19
|
+
|
20
|
+
image.should_receive(:pixels) { pixels }
|
21
|
+
|
22
|
+
screenshot = Janus::Screenshot.new(image)
|
23
|
+
screenshot.pixels.should == pixels
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: janus-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Gignac
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: colorize
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.7.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.7.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: gli
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: oily_png
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sauce-connect
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.3.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.3.1
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: selenium-webdriver
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +174,7 @@ files:
|
|
146
174
|
- .gitignore
|
147
175
|
- .rspec
|
148
176
|
- .travis.yml
|
177
|
+
- CHANGELOG.md
|
149
178
|
- Gemfile
|
150
179
|
- Guardfile
|
151
180
|
- LICENSE
|
@@ -154,21 +183,39 @@ files:
|
|
154
183
|
- bin/janus
|
155
184
|
- janus.gemspec
|
156
185
|
- lib/janus.rb
|
186
|
+
- lib/janus/browser.rb
|
157
187
|
- lib/janus/command/initialize.rb
|
158
188
|
- lib/janus/command/record.rb
|
159
189
|
- lib/janus/command/validate.rb
|
160
190
|
- lib/janus/configuration.rb
|
191
|
+
- lib/janus/core/engine.rb
|
192
|
+
- lib/janus/core/error.rb
|
193
|
+
- lib/janus/core/rule.rb
|
194
|
+
- lib/janus/io/directory.rb
|
195
|
+
- lib/janus/io/selenium.rb
|
161
196
|
- lib/janus/screenshot.rb
|
162
197
|
- lib/janus/template/Janusfile
|
163
198
|
- lib/janus/test.rb
|
164
199
|
- lib/janus/version.rb
|
165
|
-
- spec/
|
166
|
-
- spec/
|
167
|
-
- spec/
|
168
|
-
- spec/
|
169
|
-
- spec/
|
170
|
-
- spec/
|
171
|
-
- spec/
|
200
|
+
- spec/integration/engine_spec.rb
|
201
|
+
- spec/support/square-base.png
|
202
|
+
- spec/support/square-big.png
|
203
|
+
- spec/support/square-ten.png
|
204
|
+
- spec/support/square-thirty.png
|
205
|
+
- spec/support/square-twenty.png
|
206
|
+
- spec/unit/janus/browser_spec.rb
|
207
|
+
- spec/unit/janus/command/initialize_spec.rb
|
208
|
+
- spec/unit/janus/command/record_spec.rb
|
209
|
+
- spec/unit/janus/command/validate_spec.rb
|
210
|
+
- spec/unit/janus/configuration_spec.rb
|
211
|
+
- spec/unit/janus/core/engine_spec.rb
|
212
|
+
- spec/unit/janus/core/error_spec.rb
|
213
|
+
- spec/unit/janus/core/rule_spec.rb
|
214
|
+
- spec/unit/janus/io/directory_spec.rb
|
215
|
+
- spec/unit/janus/io/selenium_spec.rb
|
216
|
+
- spec/unit/janus/screenshot_spec.rb
|
217
|
+
- spec/unit/janus/test_spec.rb
|
218
|
+
- spec/unit/spec_helper.rb
|
172
219
|
homepage: https://github.com/bradgignac/janus
|
173
220
|
licenses:
|
174
221
|
- MIT
|
@@ -194,10 +241,22 @@ signing_key:
|
|
194
241
|
specification_version: 4
|
195
242
|
summary: Automated visual regression testing on Sauce Labs.
|
196
243
|
test_files:
|
197
|
-
- spec/
|
198
|
-
- spec/
|
199
|
-
- spec/
|
200
|
-
- spec/
|
201
|
-
- spec/
|
202
|
-
- spec/
|
203
|
-
- spec/
|
244
|
+
- spec/integration/engine_spec.rb
|
245
|
+
- spec/support/square-base.png
|
246
|
+
- spec/support/square-big.png
|
247
|
+
- spec/support/square-ten.png
|
248
|
+
- spec/support/square-thirty.png
|
249
|
+
- spec/support/square-twenty.png
|
250
|
+
- spec/unit/janus/browser_spec.rb
|
251
|
+
- spec/unit/janus/command/initialize_spec.rb
|
252
|
+
- spec/unit/janus/command/record_spec.rb
|
253
|
+
- spec/unit/janus/command/validate_spec.rb
|
254
|
+
- spec/unit/janus/configuration_spec.rb
|
255
|
+
- spec/unit/janus/core/engine_spec.rb
|
256
|
+
- spec/unit/janus/core/error_spec.rb
|
257
|
+
- spec/unit/janus/core/rule_spec.rb
|
258
|
+
- spec/unit/janus/io/directory_spec.rb
|
259
|
+
- spec/unit/janus/io/selenium_spec.rb
|
260
|
+
- spec/unit/janus/screenshot_spec.rb
|
261
|
+
- spec/unit/janus/test_spec.rb
|
262
|
+
- spec/unit/spec_helper.rb
|