janus-cli 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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