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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -1
  4. data/CHANGELOG.md +7 -0
  5. data/Guardfile +2 -2
  6. data/README.md +11 -20
  7. data/Rakefile +11 -1
  8. data/bin/janus +1 -1
  9. data/janus.gemspec +3 -1
  10. data/lib/janus.rb +0 -1
  11. data/lib/janus/browser.rb +19 -0
  12. data/lib/janus/command/record.rb +35 -4
  13. data/lib/janus/command/validate.rb +39 -5
  14. data/lib/janus/configuration.rb +21 -2
  15. data/lib/janus/core/engine.rb +26 -0
  16. data/lib/janus/core/error.rb +6 -0
  17. data/lib/janus/core/rule.rb +46 -0
  18. data/lib/janus/io/directory.rb +40 -0
  19. data/lib/janus/io/selenium.rb +43 -0
  20. data/lib/janus/screenshot.rb +7 -27
  21. data/lib/janus/version.rb +1 -1
  22. data/spec/integration/engine_spec.rb +50 -0
  23. data/spec/support/square-base.png +0 -0
  24. data/spec/support/square-big.png +0 -0
  25. data/spec/support/square-ten.png +0 -0
  26. data/spec/support/square-thirty.png +0 -0
  27. data/spec/support/square-twenty.png +0 -0
  28. data/spec/unit/janus/browser_spec.rb +57 -0
  29. data/spec/{janus → unit/janus}/command/initialize_spec.rb +1 -1
  30. data/spec/unit/janus/command/record_spec.rb +93 -0
  31. data/spec/unit/janus/command/validate_spec.rb +105 -0
  32. data/spec/{janus → unit/janus}/configuration_spec.rb +42 -0
  33. data/spec/unit/janus/core/engine_spec.rb +36 -0
  34. data/spec/unit/janus/core/error_spec.rb +4 -0
  35. data/spec/unit/janus/core/rule_spec.rb +65 -0
  36. data/spec/unit/janus/io/directory_spec.rb +83 -0
  37. data/spec/unit/janus/io/selenium_spec.rb +78 -0
  38. data/spec/unit/janus/screenshot_spec.rb +26 -0
  39. data/spec/{janus → unit/janus}/test_spec.rb +0 -0
  40. data/spec/{spec_helper.rb → unit/spec_helper.rb} +0 -0
  41. metadata +78 -19
  42. data/spec/janus/command/record_spec.rb +0 -36
  43. data/spec/janus/command/validate_spec.rb +0 -44
  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,4 @@
1
+ require 'janus/core/error'
2
+
3
+ describe Janus::Core::ComparisonError do
4
+ 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.1.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-08 00:00:00.000000000 Z
11
+ date: 2014-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: colored
14
+ name: colorize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '1.2'
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: '1.2'
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/janus/command/initialize_spec.rb
166
- - spec/janus/command/record_spec.rb
167
- - spec/janus/command/validate_spec.rb
168
- - spec/janus/configuration_spec.rb
169
- - spec/janus/screenshot_spec.rb
170
- - spec/janus/test_spec.rb
171
- - spec/spec_helper.rb
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/janus/command/initialize_spec.rb
198
- - spec/janus/command/record_spec.rb
199
- - spec/janus/command/validate_spec.rb
200
- - spec/janus/configuration_spec.rb
201
- - spec/janus/screenshot_spec.rb
202
- - spec/janus/test_spec.rb
203
- - spec/spec_helper.rb
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