chemistrykit 3.9.0.rc2 → 3.9.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -1
- data/Gemfile +2 -1
- data/README.md +3 -3
- data/TODO.md +2 -0
- data/chemistrykit.gemspec +2 -3
- data/features/basic_auth.feature +0 -1
- data/features/chemists.feature +13 -5
- data/features/exit_status.feature +0 -1
- data/features/reporting.feature +0 -3
- data/features/split_testing.feature +29 -0
- data/features/step_definitions/steps.rb +1 -1
- data/features/tags.feature +0 -1
- data/lib/chemistrykit/cli/cli.rb +10 -15
- data/lib/chemistrykit/config/basic_auth.rb +37 -0
- data/lib/chemistrykit/config/split_testing.rb +26 -0
- data/lib/chemistrykit/configuration.rb +15 -4
- data/lib/chemistrykit/reporting/html_report_assembler.rb +40 -2
- data/lib/chemistrykit/rspec/html_formatter.rb +5 -0
- data/lib/chemistrykit/split_testing/optimizely_provider.rb +21 -0
- data/lib/chemistrykit/split_testing/provider_factory.rb +18 -0
- data/report/index.html +81 -1
- data/report/sass/app.scss +54 -2
- data/report/stylesheets/app.css +820 -116
- data/spec/integration/lib/chemistrykit/split_testing/provider_factory_spec.rb +15 -0
- data/spec/spec_helper.rb +0 -6
- data/spec/support/config.yaml +8 -0
- data/spec/unit/lib/chemistrykit/catalyst_spec.rb +1 -0
- data/spec/unit/lib/chemistrykit/cli/helpers/formula_loader_spec.rb +1 -0
- data/spec/unit/lib/chemistrykit/config/basic_auth_spec.rb +76 -0
- data/spec/unit/lib/chemistrykit/config/split_testing_spec.rb +31 -0
- data/spec/unit/lib/chemistrykit/configuration_spec.rb +30 -0
- data/spec/unit/lib/chemistrykit/formula/base_spec.rb +1 -0
- data/spec/unit/lib/chemistrykit/split_testing/optimizely_provider_spec.rb +42 -0
- data/spec/unit/lib/chemistrykit/split_testing/provider_factory_spec.rb +22 -0
- metadata +21 -5
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
+
#3.9.0-rc.3 (2013-08-19)
|
2
|
+
- added toggle for parts of html reports
|
3
|
+
- added a fix to allow jenkins ci server to show the html report images
|
4
|
+
- integrated new selenium connect
|
5
|
+
- updates to configurations
|
6
|
+
- integrated optimizely opt out
|
7
|
+
|
1
8
|
#3.9.0-rc.2 (2013-08-14)
|
2
|
-
Added Basic Auth Support. Preserving release candidate numbering since there are improvements to be made to HTTP reporting
|
9
|
+
- Added Basic Auth Support. Preserving release candidate numbering since there are improvements to be made to HTTP reporting
|
3
10
|
|
4
11
|
#3.9.0-rc.1 (2013-08-12)
|
5
12
|
Release candidate with new features including
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#ChemistryKit 3.9.0
|
1
|
+
#ChemistryKit 3.9.0.rc3 (2013-08-19)
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/chemistrykit.png)](http://badge.fury.io/rb/chemistrykit) [![Build Status](https://travis-ci.org/arrgyle/chemistrykit.png?branch=develop)](https://travis-ci.org/jrobertfox/chef-broiler-platter) [![Code Climate](https://codeclimate.com/github/arrgyle/chemistrykit.png)](https://codeclimate.com/github/arrgyle/chemistrykit) [![Coverage Status](https://coveralls.io/repos/arrgyle/chemistrykit/badge.png?branch=develop)](https://coveralls.io/r/arrgyle/chemistrykit?branch=develop)
|
4
4
|
|
@@ -138,11 +138,11 @@ Here is a summary of the other methods available:
|
|
138
138
|
Using `.and_with` lets you mix up various sets of user data. For example:
|
139
139
|
|
140
140
|
@formula_lab.using('my_formula').with('admin1').and_with('sub_account1').mix
|
141
|
-
|
141
|
+
|
142
142
|
Would get you (assuming `sub_account1` has a type of `sub_account`, and a field `my_sub_field`) the ability to do something like this:
|
143
143
|
|
144
144
|
chemist.sub_account.my_sub_field
|
145
|
-
|
145
|
+
|
146
146
|
Inside your formula. COOL!
|
147
147
|
|
148
148
|
|
data/TODO.md
CHANGED
data/chemistrykit.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'chemistrykit'
|
5
|
-
s.version = '3.9.0.
|
5
|
+
s.version = '3.9.0.rc3'
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ['Dave Haeffner', 'Jason Fox']
|
8
8
|
s.email = ['dave@arrgyle.com', 'jason@arrgyle.com']
|
@@ -24,12 +24,11 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency 'builder', '~> 3.2.2'
|
25
25
|
s.add_dependency 'selenium-webdriver', '~> 2.29.0'
|
26
26
|
s.add_dependency 'rest-client', '~> 1.6.7'
|
27
|
-
s.add_dependency 'selenium-connect', '~> 3.
|
27
|
+
s.add_dependency 'selenium-connect', '~> 3.6.0'
|
28
28
|
s.add_dependency 'parallel_tests', '~> 0.15.0'
|
29
29
|
s.add_dependency 'parallel', '~> 0.7.0'
|
30
30
|
s.add_dependency 'rspec-retry', '~> 0.2.1'
|
31
31
|
s.add_dependency 'nokogiri', '~> 1.6.0'
|
32
|
-
|
33
32
|
s.add_dependency 'syntax'
|
34
33
|
s.add_dependency 'pygments.rb', '~> 0.5.2'
|
35
34
|
end
|
data/features/basic_auth.feature
CHANGED
data/features/chemists.feature
CHANGED
@@ -11,6 +11,13 @@ Feature: Brewing a ChemistryKit project
|
|
11
11
|
ran1,random,normal@email.com,Ms. Normal,test123%
|
12
12
|
ran2,random,normal@email.com,Ms. Normal,test123%
|
13
13
|
"""
|
14
|
+
And I overwrite config.yaml with:
|
15
|
+
"""
|
16
|
+
screenshot_on_fail: true
|
17
|
+
selenium_connect:
|
18
|
+
log: 'evidence'
|
19
|
+
browser: 'firefox'
|
20
|
+
"""
|
14
21
|
And a file named "formulas/basic_formula.rb" with:
|
15
22
|
"""
|
16
23
|
module Formulas
|
@@ -76,13 +83,13 @@ Feature: Brewing a ChemistryKit project
|
|
76
83
|
@driver.get url
|
77
84
|
end
|
78
85
|
|
79
|
-
def find(
|
80
|
-
@driver.find_element
|
86
|
+
def find(locater)
|
87
|
+
@driver.find_element locater
|
81
88
|
end
|
82
89
|
|
83
|
-
def displayed?(
|
90
|
+
def displayed?(locater)
|
84
91
|
begin
|
85
|
-
find(
|
92
|
+
find(locater).displayed?
|
86
93
|
rescue
|
87
94
|
false
|
88
95
|
end
|
@@ -154,6 +161,7 @@ Feature: Brewing a ChemistryKit project
|
|
154
161
|
When I run `ckit brew`
|
155
162
|
Then the stdout should contain "2 examples, 0 failures"
|
156
163
|
|
164
|
+
@announce
|
157
165
|
Scenario: Composing a chemist from multiple files
|
158
166
|
Given a file named "beakers/chemist_beaker.rb" with:
|
159
167
|
"""
|
@@ -170,7 +178,7 @@ Feature: Brewing a ChemistryKit project
|
|
170
178
|
And a file named "chemists/others.csv" with:
|
171
179
|
"""
|
172
180
|
Key,Type,Item
|
173
|
-
other1,some_sub_account,
|
181
|
+
other1,some_sub_account,some
|
174
182
|
"""
|
175
183
|
When I run `ckit brew`
|
176
184
|
Then the stdout should contain "1 example, 0 failures"
|
data/features/reporting.feature
CHANGED
@@ -48,14 +48,12 @@ Feature: Advanced HTML Reports
|
|
48
48
|
browser: 'firefox'
|
49
49
|
"""
|
50
50
|
|
51
|
-
@announce
|
52
51
|
Scenario: I can run the tests
|
53
52
|
When I run `ckit brew`
|
54
53
|
Then the stdout should contain "5 examples, 3 failures, 1 pending"
|
55
54
|
And the following files should exist:
|
56
55
|
| evidence/final_results.html |
|
57
56
|
|
58
|
-
@announce
|
59
57
|
Scenario: I can run the tests local with concurrency
|
60
58
|
Given I overwrite config.yaml with:
|
61
59
|
"""
|
@@ -70,7 +68,6 @@ Feature: Advanced HTML Reports
|
|
70
68
|
And the following files should exist:
|
71
69
|
| evidence/final_results.html |
|
72
70
|
|
73
|
-
@announce
|
74
71
|
Scenario: I can run the tests with concurrency
|
75
72
|
Given I overwrite config.yaml with:
|
76
73
|
"""
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: opting out of ab tests based on configuration
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I run `ckit new split-test`
|
5
|
+
And I cd to "split-test"
|
6
|
+
And a file named "beakers/first_beaker.rb" with:
|
7
|
+
"""
|
8
|
+
describe "Split test beaker", :depth => 'shallow' do
|
9
|
+
it "would not hit the ab testing end point" do
|
10
|
+
@driver.get 'http://the-internet.herokuapp.com/abtest'
|
11
|
+
@driver.find_element(css: 'h3').text.should == 'No A/B Test'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
"""
|
15
|
+
And I overwrite config.yaml with:
|
16
|
+
"""
|
17
|
+
screenshot_on_fail: true
|
18
|
+
base_url: 'http://the-internet.herokuapp.com/abtest'
|
19
|
+
selenium_connect:
|
20
|
+
log: 'evidence'
|
21
|
+
browser: 'firefox'
|
22
|
+
split_testing:
|
23
|
+
provider: 'optimizely'
|
24
|
+
opt_out: true
|
25
|
+
"""
|
26
|
+
|
27
|
+
Scenario: opt out is on
|
28
|
+
When I run `ckit brew`
|
29
|
+
Then the stdout should contain "1 example, 0 failures"
|
@@ -30,7 +30,7 @@ Then(/^there should be "(.*?)" "(.*?)" log files in "(.*?)"$/) do |number, type,
|
|
30
30
|
when 'report'
|
31
31
|
count += 1 if file =~ /sauce_job\.log/
|
32
32
|
when 'sauce log'
|
33
|
-
|
33
|
+
count += 1 if file =~ /server\.log/
|
34
34
|
end
|
35
35
|
end
|
36
36
|
count.should == number.to_i
|
data/features/tags.feature
CHANGED
data/lib/chemistrykit/cli/cli.rb
CHANGED
@@ -21,6 +21,8 @@ require 'rspec/core/formatters/html_formatter'
|
|
21
21
|
require 'chemistrykit/rspec/html_formatter'
|
22
22
|
|
23
23
|
require 'chemistrykit/reporting/html_report_assembler'
|
24
|
+
require 'chemistrykit/split_testing/provider_factory'
|
25
|
+
|
24
26
|
module ChemistryKit
|
25
27
|
module CLI
|
26
28
|
|
@@ -124,7 +126,6 @@ module ChemistryKit
|
|
124
126
|
protected
|
125
127
|
|
126
128
|
def process_html
|
127
|
-
puts 'PROCESS HTML CALLED'
|
128
129
|
File.join(Dir.getwd, 'evidence')
|
129
130
|
results_folder = File.join(Dir.getwd, 'evidence')
|
130
131
|
output_file = File.join(Dir.getwd, 'evidence', 'final_results.html')
|
@@ -211,23 +212,17 @@ module ChemistryKit
|
|
211
212
|
example.run
|
212
213
|
end
|
213
214
|
c.before(:each) do
|
214
|
-
|
215
|
-
|
216
|
-
if config.basic_auth
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
@driver.get basic_auth_http_url
|
222
|
-
end
|
223
|
-
if config.basic_auth[:https_path]
|
224
|
-
basic_auth_https_url = config.base_url.gsub(%r{http://}, "https:\/\/#{config.basic_auth[:username]}:#{config.basic_auth[:password]}@") + config.basic_auth[:https_path]
|
225
|
-
@driver.get basic_auth_https_url
|
226
|
-
end
|
215
|
+
if config.basic_auth
|
216
|
+
@driver.get(config.basic_auth.http_url)
|
217
|
+
@driver.get(config.basic_auth.https_url) if config.basic_auth.https?
|
218
|
+
end
|
219
|
+
|
220
|
+
if config.split_testing
|
221
|
+
ChemistryKit::SplitTesting::ProviderFactory.build(config.split_testing).split(@driver)
|
227
222
|
end
|
228
223
|
end
|
229
224
|
c.after(:each) do
|
230
|
-
if example.exception
|
225
|
+
if example.exception.nil? == false
|
231
226
|
@job.finish failed: true, failshot: @config.screenshot_on_fail
|
232
227
|
else
|
233
228
|
@job.finish passed: true
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
3
|
+
module ChemistryKit
|
4
|
+
module Config
|
5
|
+
class BasicAuth
|
6
|
+
|
7
|
+
attr_accessor :username, :password, :base_url, :http_path, :https_path
|
8
|
+
|
9
|
+
def initialize(opts)
|
10
|
+
opts.each do |key, value|
|
11
|
+
begin
|
12
|
+
send("#{key}=", value)
|
13
|
+
rescue NoMethodError
|
14
|
+
raise ArgumentError.new "The config key: \"#{key}\" is unknown!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def http?
|
20
|
+
!!http_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def https?
|
24
|
+
!!https_path
|
25
|
+
end
|
26
|
+
|
27
|
+
def http_url
|
28
|
+
base_url.gsub(%r{http://}, "http:\/\/#{username}:#{password}@") + (http_path || '')
|
29
|
+
end
|
30
|
+
|
31
|
+
def https_url
|
32
|
+
base_url.gsub(%r{http://}, "https:\/\/#{username}:#{password}@") + (https_path || '')
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
3
|
+
module ChemistryKit
|
4
|
+
module Config
|
5
|
+
class SplitTesting
|
6
|
+
|
7
|
+
attr_accessor :provider, :base_url
|
8
|
+
|
9
|
+
attr_writer :opt_out
|
10
|
+
|
11
|
+
def initialize(opts)
|
12
|
+
opts.each do |key, value|
|
13
|
+
begin
|
14
|
+
send("#{key}=", value)
|
15
|
+
rescue NoMethodError
|
16
|
+
raise ArgumentError.new "The config key: \"#{key}\" is unknown!"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def opt_out?
|
22
|
+
!!@opt_out
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -3,6 +3,9 @@
|
|
3
3
|
require 'yaml'
|
4
4
|
require 'ostruct'
|
5
5
|
|
6
|
+
require 'chemistrykit/config/basic_auth'
|
7
|
+
require 'chemistrykit/config/split_testing'
|
8
|
+
|
6
9
|
module ChemistryKit
|
7
10
|
# Default configuration class
|
8
11
|
class Configuration
|
@@ -10,10 +13,9 @@ module ChemistryKit
|
|
10
13
|
attr_accessor :base_url,
|
11
14
|
:concurrency,
|
12
15
|
:screenshot_on_fail,
|
13
|
-
:retries_on_failure
|
14
|
-
:basic_auth
|
16
|
+
:retries_on_failure
|
15
17
|
|
16
|
-
attr_reader :log
|
18
|
+
attr_reader :log, :basic_auth, :split_testing
|
17
19
|
|
18
20
|
attr_writer :selenium_connect
|
19
21
|
|
@@ -27,7 +29,8 @@ module ChemistryKit
|
|
27
29
|
@log.path = 'evidence'
|
28
30
|
@log.results_file = 'results_junit.xml'
|
29
31
|
@log.format = 'ChemistryKit::RSpec::JUnitFormatter'
|
30
|
-
@basic_auth =
|
32
|
+
@basic_auth = nil
|
33
|
+
@split_testing = nil
|
31
34
|
|
32
35
|
# overide with argument
|
33
36
|
populate_with_hash hash
|
@@ -40,6 +43,14 @@ module ChemistryKit
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
46
|
+
def basic_auth=(basic_auth_hash)
|
47
|
+
@basic_auth = ChemistryKit::Config::BasicAuth.new(basic_auth_hash.merge(base_url: base_url))
|
48
|
+
end
|
49
|
+
|
50
|
+
def split_testing=(split_testing_hash)
|
51
|
+
@split_testing = ChemistryKit::Config::SplitTesting.new(split_testing_hash.merge(base_url: base_url))
|
52
|
+
end
|
53
|
+
|
43
54
|
def selenium_connect
|
44
55
|
# return the default log unless the sc log is set
|
45
56
|
if @selenium_connect[:log].nil?
|
@@ -43,7 +43,7 @@ module ChemistryKit
|
|
43
43
|
file.write '<!--[if IE 8]> <html class="no-js lt-ie9" lang="en" > <![endif]-->'
|
44
44
|
file.write '<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->'
|
45
45
|
|
46
|
-
file.write get_report_head
|
46
|
+
file.write get_report_head status
|
47
47
|
file.write '<body>'
|
48
48
|
file.write get_report_header
|
49
49
|
file.write '<div class="report">'
|
@@ -101,12 +101,30 @@ module ChemistryKit
|
|
101
101
|
build_fragment do |doc|
|
102
102
|
doc.div(class: 'summary') do
|
103
103
|
doc.div(class: "row status #{status}") do
|
104
|
-
doc.div(class: 'large-
|
104
|
+
doc.div(class: 'large-9 columns') do
|
105
105
|
doc.h1 do
|
106
106
|
doc.i(class: icon)
|
107
107
|
doc.text message
|
108
108
|
end
|
109
109
|
end
|
110
|
+
doc.div(class: 'large-3 columns top-row') do
|
111
|
+
%w[passing failing pending].each do | type |
|
112
|
+
doc.div(class: 'row switch-row') do
|
113
|
+
doc.div(class: 'large-6 columns switch-label') do
|
114
|
+
doc.text type.capitalize
|
115
|
+
end
|
116
|
+
doc.div(class: 'large-6 columns') do
|
117
|
+
doc.div(class: "#{type}-switch") do
|
118
|
+
doc.input(id: "show-#{type}", onclick: "toggle#{type.capitalize}();", name: "switch-show-#{type}", type: 'radio', checked: 'checked')
|
119
|
+
doc.label(for: "show-#{type}") { doc.text 'Hide' }
|
120
|
+
doc.input(id: "show-#{type}1", onclick: "toggle#{type.capitalize}();", name: "switch-show-#{type}", type: 'radio')
|
121
|
+
doc.label(for: "show-#{type}1") { doc.text 'Show' }
|
122
|
+
doc.span
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
110
128
|
end
|
111
129
|
doc.div(class: 'row details') do
|
112
130
|
doc.div(class: 'large-12 columns') do
|
@@ -150,6 +168,26 @@ module ChemistryKit
|
|
150
168
|
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'javascripts', 'foundation', 'foundation.section.js'))
|
151
169
|
end
|
152
170
|
doc.script { doc.text '$(document).foundation();' }
|
171
|
+
doc.script do
|
172
|
+
doc.text "
|
173
|
+
function togglePassing() {
|
174
|
+
console.log('passing')
|
175
|
+
$('.example.passing').toggle();
|
176
|
+
$('.example-group.passing').toggle();
|
177
|
+
}
|
178
|
+
|
179
|
+
function toggleFailing() {
|
180
|
+
console.log('failing')
|
181
|
+
$('.example.failing').toggle();
|
182
|
+
$('.example-group.failing').toggle();
|
183
|
+
}
|
184
|
+
|
185
|
+
function togglePending() {
|
186
|
+
console.log('pending')
|
187
|
+
$('.example.pending').toggle();
|
188
|
+
$('.example-group.pending').toggle();
|
189
|
+
}"
|
190
|
+
end
|
153
191
|
end
|
154
192
|
end
|
155
193
|
|
@@ -128,9 +128,14 @@ module ChemistryKit
|
|
128
128
|
def render_failshot_if_found(example)
|
129
129
|
beaker_folder = slugify(@example_group.description)
|
130
130
|
example_folder = slugify(@example_group.description + '_' + example.description)
|
131
|
+
|
131
132
|
path = File.join(Dir.getwd, 'evidence', beaker_folder, example_folder, 'failshot.png')
|
132
133
|
if File.exist?(path)
|
133
134
|
render_section('Failure Screenshot') do |doc|
|
135
|
+
# if this is a jenkins job this variable is set and we can use it to get the right path to the images
|
136
|
+
if ENV['JOB_NAME']
|
137
|
+
path = File.join("/job/#{ENV['JOB_NAME']}/ws", 'evidence', beaker_folder, example_folder, 'failshot.png')
|
138
|
+
end
|
134
139
|
doc.img(src: path)
|
135
140
|
end
|
136
141
|
end
|