govuk_ab_testing 2.0.0 → 2.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 855c19cb71753681212ec44568952404cda4be1f
4
- data.tar.gz: 003b91391e240a88f29321d2f37674895017df3a
3
+ metadata.gz: 84d90e7b73cb4f14c3ddc5670921e7077a85ecca
4
+ data.tar.gz: 6e933bd3bc167d9995097901654893c26c4300dc
5
5
  SHA512:
6
- metadata.gz: efbeee80a3643a4d3839842841b552cef0e2fe61addfc818cd5649626d2be38f4579369f33359d02ce46f52ad24c2c18447bbb3d756a8848f8951c28bc310926
7
- data.tar.gz: 5553b89840a15687c569c3d59c0ccb1877e36664974558e67a0572b7bde005be35459cc9feff64b15eb4cb4922ca75280525b218ddd5e7b1764fe7a997d2d21d
6
+ metadata.gz: 7a929e3cf5b0a044a1dc2b2cde0d8e6b7541bd110a5569c0e38c466aa5b908750658ab7749ff251774dfd89542f2457b8781c1304430f011c550f13b41315e7a
7
+ data.tar.gz: ab6bee9421a644a0e906f1073b3a751917c60b41306f42f4c51e7ccd84aae6f453f8c8c17e819df5868c550df0db1201b6ef34dbfa628649f2f8bc576fb04414
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 2.1.0
2
+
3
+ * Refactor both RSpec and Minitest helpers to use the same Abstract helper
4
+ * Allow assertions on the Vary header for multiple concurrent A/B tests
5
+ * Fix a broken RSpec assertion
6
+ * Fix meta tag dimension checking
7
+
1
8
  ## 2.0.0
2
9
 
3
10
  * **BREAKING CHANGE** `assert_response_not_modified_for_ab_test` now
@@ -1,6 +1,9 @@
1
1
  module GovukAbTesting
2
2
  class AbTest
3
3
  attr_reader :ab_test_name
4
+ attr_reader :dimension
5
+
6
+ alias_method :name, :ab_test_name
4
7
 
5
8
  # @param request [String] the name of the A/B test
6
9
  # @param dimension [Integer] the dimension registered with Google Analytics
@@ -0,0 +1,128 @@
1
+ module GovukAbTesting
2
+ module AbstractHelpers
3
+ def acceptance_test_framework
4
+ @acceptance_test_framework ||= GovukAbTesting.configuration.framework_class.new(self)
5
+ end
6
+
7
+ def with_variant(args)
8
+ ab_test_name, variant = args.first
9
+ dimension = args[:dimension]
10
+
11
+ setup_ab_variant(ab_test_name, variant, dimension)
12
+
13
+ yield
14
+
15
+ assert_response_is_cached_by_variant(ab_test_name)
16
+
17
+ unless args[:assert_meta_tag] == false
18
+ assert_page_tracked_in_ab_test(ab_test_name, variant, dimension)
19
+ end
20
+ end
21
+
22
+ def setup_ab_variant(ab_test_name, variant, dimension = 300)
23
+ ab_test = AbTest.new(ab_test_name, dimension: dimension)
24
+ acceptance_test_framework.set_header(ab_test.request_header, variant)
25
+ end
26
+
27
+ def assert_response_is_cached_by_variant(ab_test_name)
28
+ ab_test = AbTest.new(ab_test_name, dimension: 300)
29
+ vary_header_value = acceptance_test_framework.vary_header
30
+
31
+ assert_contains_substring(
32
+ string: vary_header_value,
33
+ substring: ab_test.response_header,
34
+ error_message: <<-ERROR
35
+ The 'Vary' header is not being set for the '#{ab_test.name}' A/B test.
36
+ You will need to use GovukAbTesting::RequestedVariant#configure_response in your controller:
37
+
38
+ requested_variant.configure_response(response)
39
+
40
+ ERROR
41
+ )
42
+ end
43
+
44
+ def assert_response_not_modified_for_ab_test(ab_test_name)
45
+ vary_header = acceptance_test_framework.vary_header
46
+ assert_does_not_contain_substring(
47
+ string: vary_header,
48
+ substring: ab_test_name,
49
+ error_message: <<-ERROR
50
+ The 'Vary' header is being set by A/B test '#{ab_test_name}' on a page that should not be modified
51
+ by the A/B test. Check for incorrect usage of GovukAbTesting::RequestedVariant#configure_response
52
+ in your controller.
53
+
54
+ 'Vary': #{vary_header}
55
+
56
+ ERROR
57
+ )
58
+ end
59
+
60
+ def assert_page_not_tracked_in_ab_test(ab_test_name)
61
+ ab_test_meta_tags =
62
+ acceptance_test_framework.analytics_meta_tags_for_test(ab_test_name)
63
+
64
+ assert_is_empty(
65
+ enumerable: ab_test_meta_tags,
66
+ error_message: <<-ERROR
67
+ Found the following '#{ab_test_name}' A/B testing meta tag on a page that should not be modified by
68
+ the A/B test:
69
+
70
+ #{ab_test_meta_tags.first.content}
71
+
72
+ Check for incorrect usage of GovukAbTesting::RequestedVariant#analytics_meta_tag
73
+ ERROR
74
+ )
75
+ end
76
+
77
+ def assert_page_tracked_in_ab_test(ab_test_name, variant, dimension)
78
+ ab_test = AbTest.new(ab_test_name, dimension: dimension)
79
+
80
+ ab_test_meta_tags =
81
+ acceptance_test_framework.analytics_meta_tags_for_test(ab_test.name)
82
+
83
+ assert_has_size(
84
+ enumerable: ab_test_meta_tags,
85
+ size: 1,
86
+ error_message: <<-ERROR
87
+ Incorrect number of analytics meta tags on the page for A/B test '#{ab_test.name}'.
88
+ You may need to check usage of GovukAbTesting::RequestedVariant#analytics_meta_tag in your template(s):
89
+
90
+ <%= requested_variant.analytics_meta_tag %>
91
+
92
+ ERROR
93
+ )
94
+
95
+ meta_tag = ab_test_meta_tags.first
96
+ expected_metatag_content = "#{ab_test.meta_tag_name}:#{variant}"
97
+
98
+ assert_is_equal(
99
+ expected: expected_metatag_content,
100
+ actual: meta_tag.content,
101
+ error_message: <<-ERROR
102
+ The analytics meta tag content for A/B test '#{ab_test.name}' does not match the expected value.
103
+ You may need to use GovukAbTesting::RequestedVariant#analytics_meta_tag in your template(s):
104
+
105
+ <%= requested_variant.analytics_meta_tag %>
106
+
107
+ ERROR
108
+ )
109
+
110
+ assert_not_blank(
111
+ string: meta_tag.dimension,
112
+ error_message: <<-ERROR
113
+ The meta tag dimension for the '#{ab_test_name}' A/B test is blank.
114
+ ERROR
115
+ )
116
+
117
+ unless ab_test.dimension.nil?
118
+ assert_is_equal(
119
+ expected: ab_test.dimension.to_s,
120
+ actual: meta_tag.dimension.to_s,
121
+ error_message: <<-ERROR
122
+ The analytics meta tag for the '#{ab_test.name}' A/B test does not match the expected value.
123
+ ERROR
124
+ )
125
+ end
126
+ end
127
+ end
128
+ end
@@ -10,6 +10,7 @@ module GovukAbTesting
10
10
  end
11
11
  @scope = scope
12
12
  @request_headers = {}
13
+ @response = scope.instance_variable_get(:@response)
13
14
  end
14
15
 
15
16
  def set_header(name, value)
@@ -17,8 +18,8 @@ module GovukAbTesting
17
18
  @request_headers[name] = value
18
19
  end
19
20
 
20
- def vary_header(response)
21
- response.headers['Vary']
21
+ def vary_header
22
+ @response.headers['Vary']
22
23
  end
23
24
 
24
25
  def analytics_meta_tags_for_test(ab_test_name)
@@ -0,0 +1,28 @@
1
+ module GovukAbTesting
2
+ module MinitestAssertions
3
+ def assert_is_equal(expected:, actual:, error_message:)
4
+ assert_equal(expected, actual, error_message)
5
+ end
6
+
7
+ def assert_contains_substring(string:, substring:, error_message:)
8
+ assert_match(/#{substring}/, string, error_message)
9
+ end
10
+
11
+ def assert_does_not_contain_substring(string:, substring:, error_message:)
12
+ refute_match(/#{substring}/, string, error_message)
13
+ end
14
+
15
+ def assert_has_size(enumerable:, size:, error_message:)
16
+ assert_equal(size, enumerable.count, error_message)
17
+ end
18
+
19
+ def assert_is_empty(enumerable:, error_message:)
20
+ assert_has_size(enumerable, 0, error_message)
21
+ end
22
+
23
+ def assert_not_blank(string:, error_message:)
24
+ refute_nil(string, error_message)
25
+ refute_equal(string.length, 0, error_message)
26
+ end
27
+ end
28
+ end
@@ -1,90 +1,6 @@
1
1
  module GovukAbTesting
2
2
  module MinitestHelpers
3
- def acceptance_test_framework
4
- @acceptance_test_framework ||=
5
- GovukAbTesting.configuration.framework_class.new(self)
6
- end
7
-
8
- def with_variant(args)
9
- ab_test_name, variant = args.first
10
- dimension = args[:dimension]
11
-
12
- ab_test =
13
- GovukAbTesting::AbTest.new(ab_test_name.to_s, dimension: dimension)
14
-
15
- acceptance_test_framework.set_header(ab_test.request_header, variant)
16
- requested_variant = ab_test.requested_variant(acceptance_test_framework.request_headers)
17
-
18
- yield
19
-
20
- vary_header_value = acceptance_test_framework.vary_header(response)
21
- assert_match ab_test.response_header, vary_header_value,
22
- "You probably forgot to use `configure_response`"
23
-
24
- unless args[:assert_meta_tag] == false
25
- expected_content =
26
- ab_test.meta_tag_name + ':' + requested_variant.variant_name
27
- message = "You probably forgot to add the `analytics_meta_tag` to the views"
28
- meta_tags =
29
- acceptance_test_framework.analytics_meta_tags_for_test(ab_test_name)
30
-
31
- assert_equal(1, meta_tags.count, message)
32
-
33
- meta_tag = meta_tags.first
34
-
35
- assert_equal(
36
- expected_content,
37
- meta_tag.content,
38
- "Meta tag's content doesnt match."
39
- )
40
-
41
- if dimension.nil?
42
- assert(meta_tag.dimension, "No custom dimension number found")
43
- else
44
- assert_equal(
45
- dimension.to_s,
46
- meta_tag.dimension,
47
- "The custom dimension found in meta tag doesn't match"
48
- )
49
- end
50
- end
51
- end
52
-
53
- def setup_ab_variant(ab_test_name, variant, dimension = 300)
54
- ab_test = GovukAbTesting::AbTest.new(ab_test_name, dimension: dimension)
55
-
56
- acceptance_test_framework.set_header(ab_test.request_header, variant)
57
- end
58
-
59
- def assert_response_is_cached_by_variant(ab_test_name)
60
- ab_test = GovukAbTesting::AbTest.new(ab_test_name, dimension: 123)
61
-
62
- vary_header_value = acceptance_test_framework.vary_header(response)
63
- assert_match ab_test.response_header, vary_header_value,
64
- "You probably forgot to use `configure_response`"
65
- end
66
-
67
- def assert_response_not_modified_for_ab_test(ab_test_name)
68
- vary_header = acceptance_test_framework.vary_header(response)
69
-
70
- assert_no_match(
71
- /#{ab_test_name}/,
72
- vary_header,
73
- "`Vary` header is being added to a page which should not be modified by the A/B test"
74
- )
75
-
76
- assert_page_not_tracked_in_ab_test(ab_test_name)
77
- end
78
-
79
- def assert_page_not_tracked_in_ab_test(ab_test_name)
80
- meta_tags =
81
- acceptance_test_framework.analytics_meta_tags_for_test(ab_test_name)
82
-
83
- assert_equal(
84
- 0,
85
- meta_tags.count,
86
- "A/B meta tag is being added to a page which should not be modified by the A/B test"
87
- )
88
- end
3
+ include AbstractHelpers
4
+ include MinitestAssertions
89
5
  end
90
6
  end
@@ -0,0 +1,29 @@
1
+ module GovukAbTesting
2
+ module RspecAssertions
3
+ def assert_is_equal(expected:, actual:, error_message:)
4
+ expect(actual).to eq(expected), error_message
5
+ end
6
+
7
+ def assert_contains_substring(string:, substring:, error_message:)
8
+ expect(string).to include(substring), error_message
9
+ end
10
+
11
+ def assert_does_not_contain_substring(string:, substring:, error_message:)
12
+ return if string.nil?
13
+ expect(string).not_to include(substring), error_message
14
+ end
15
+
16
+ def assert_has_size(enumerable:, size:, error_message:)
17
+ expect(enumerable.count).to eq(size), error_message
18
+ end
19
+
20
+ def assert_is_empty(enumerable:, error_message:)
21
+ assert_has_size(enumerable, 0, error_message)
22
+ end
23
+
24
+ def assert_not_blank(string:, error_message:)
25
+ expect(string).not_to be_nil, error_message
26
+ expect(string.length).not_to eq(0), error_message
27
+ end
28
+ end
29
+ end
@@ -1,73 +1,6 @@
1
1
  module GovukAbTesting
2
2
  module RspecHelpers
3
- def acceptance_test_framework
4
- @acceptance_test_framework ||=
5
- GovukAbTesting.configuration.framework_class.new(self)
6
- end
7
-
8
- def with_variant(args)
9
- ab_test_name, variant = args.first
10
- dimension = args[:dimension]
11
-
12
- ab_test =
13
- GovukAbTesting::AbTest.new(ab_test_name.to_s, dimension: dimension)
14
-
15
- acceptance_test_framework.set_header(ab_test.request_header, variant)
16
- requested_variant = ab_test.requested_variant(acceptance_test_framework.request_headers)
17
-
18
- yield
19
-
20
- vary_header_value = acceptance_test_framework.vary_header
21
- expect(ab_test.response_header).to eq(vary_header_value)
22
-
23
- unless args[:assert_meta_tag] == false
24
- content = [ab_test.meta_tag_name, requested_variant.variant_name].join(':')
25
- ab_test_metatags =
26
- acceptance_test_framework.analytics_meta_tags_for_test(ab_test_name)
27
-
28
- expect(ab_test_metatags.count).to eq(1)
29
-
30
- meta_tag = ab_test_metatags.first
31
-
32
- expect(meta_tag.content).to eq(content)
33
- dimension = meta_tag.dimension
34
-
35
- if dimension.nil?
36
- expect(dimension).to_not be_nil
37
- else
38
- expect(dimension).to eq(dimension.to_s)
39
- end
40
- end
41
- end
42
-
43
- def setup_ab_variant(ab_test_name, variant, dimension = 300)
44
- ab_test = GovukAbTesting::AbTest.new(ab_test_name, dimension: dimension)
45
-
46
- acceptance_test_framework.set_header(ab_test.request_header, variant)
47
- end
48
-
49
- def assert_response_is_cached_by_variant(ab_test_name)
50
- ab_test = GovukAbTesting::AbTest.new(ab_test_name, dimension: 123)
51
-
52
- vary_header_value = acceptance_test_framework.vary_header
53
- expect(vary_header_value).to eq(ab_test.response_header)
54
- end
55
-
56
- def assert_response_not_modified_for_ab_test(ab_test_name)
57
- vary_header = acceptance_test_framework.vary_header
58
-
59
- expect(vary_header).to_not match?(/#{ab_test_name}/),
60
- "`Vary` header is being added to a page which should not be modified by the A/B test"
61
-
62
- assert_page_not_tracked_in_ab_test(ab_test_name)
63
- end
64
-
65
- def assert_page_not_tracked_in_ab_test(ab_test_name)
66
- meta_tags =
67
- acceptance_test_framework.analytics_meta_tags_for_test(ab_test_name)
68
-
69
- expect(meta_tags).to be_empty,
70
- "A/B meta tag is being added to a page which should not be modified by the A/B test"
71
- end
3
+ include AbstractHelpers
4
+ include RspecAssertions
72
5
  end
73
6
  end
@@ -1,3 +1,3 @@
1
1
  module GovukAbTesting
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.1.0".freeze
3
3
  end
@@ -1,9 +1,12 @@
1
- require "govuk_ab_testing/version"
1
+ require 'govuk_ab_testing/version'
2
2
  require 'govuk_ab_testing/configuration'
3
- require "govuk_ab_testing/requested_variant"
4
- require "govuk_ab_testing/ab_test"
5
- require "govuk_ab_testing/minitest_helpers"
6
- require "govuk_ab_testing/rspec_helpers"
3
+ require 'govuk_ab_testing/requested_variant'
4
+ require 'govuk_ab_testing/ab_test'
5
+ require 'govuk_ab_testing/minitest_assertions'
6
+ require 'govuk_ab_testing/rspec_assertions'
7
+ require 'govuk_ab_testing/abstract_helpers'
8
+ require 'govuk_ab_testing/minitest_helpers'
9
+ require 'govuk_ab_testing/rspec_helpers'
7
10
  require 'govuk_ab_testing/acceptance_tests/meta_tag'
8
11
  require 'govuk_ab_testing/acceptance_tests/capybara'
9
12
  require 'govuk_ab_testing/acceptance_tests/active_support'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_ab_testing
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-20 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -102,12 +102,15 @@ files:
102
102
  - govuk_ab_testing.gemspec
103
103
  - lib/govuk_ab_testing.rb
104
104
  - lib/govuk_ab_testing/ab_test.rb
105
+ - lib/govuk_ab_testing/abstract_helpers.rb
105
106
  - lib/govuk_ab_testing/acceptance_tests/active_support.rb
106
107
  - lib/govuk_ab_testing/acceptance_tests/capybara.rb
107
108
  - lib/govuk_ab_testing/acceptance_tests/meta_tag.rb
108
109
  - lib/govuk_ab_testing/configuration.rb
110
+ - lib/govuk_ab_testing/minitest_assertions.rb
109
111
  - lib/govuk_ab_testing/minitest_helpers.rb
110
112
  - lib/govuk_ab_testing/requested_variant.rb
113
+ - lib/govuk_ab_testing/rspec_assertions.rb
111
114
  - lib/govuk_ab_testing/rspec_helpers.rb
112
115
  - lib/govuk_ab_testing/version.rb
113
116
  homepage: https://github.com/alphagov/govuk_ab_testing