govuk_ab_testing 2.4.3 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +12 -3
- data/.ruby-version +1 -1
- data/CHANGELOG.md +7 -0
- data/README.md +5 -8
- data/govuk_ab_testing.gemspec +2 -2
- data/lib/govuk_ab_testing/ab_test.rb +3 -6
- data/lib/govuk_ab_testing/abstract_helpers.rb +7 -25
- data/lib/govuk_ab_testing/acceptance_tests/active_support.rb +0 -1
- data/lib/govuk_ab_testing/acceptance_tests/capybara.rb +0 -1
- data/lib/govuk_ab_testing/acceptance_tests/meta_tag.rb +2 -3
- data/lib/govuk_ab_testing/minitest_assertions.rb +1 -1
- data/lib/govuk_ab_testing/requested_variant.rb +1 -5
- data/lib/govuk_ab_testing/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d473c839937d932bfad0e7dc33673c907f47dedffdf15d1b5bc4bd2d9c61df1
|
4
|
+
data.tar.gz: 4ba58b2b6b499b8b670fff033740d3efb8ce421a0d5f561a58bb4b028968fd36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e5f893dcd4b96da54646fa5f951f7949f1d3e499cc51fe84b22b3869f281857ca74259ee927a4337a50a34dc50b6ef24460f578ed3af38c26b0c8dde0cad366
|
7
|
+
data.tar.gz: b438372d3a2a309acbe83dde157cd09a5a9f857ddf03ad28009e10cd212cb4034716b831fa87f41c301ee892329f9c5e3f47d8d23eb49dd34e2f3a9135f6b752
|
data/.github/workflows/ci.yml
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
on: [push, pull_request]
|
2
2
|
|
3
3
|
jobs:
|
4
|
+
codeql-sast:
|
5
|
+
name: CodeQL SAST scan
|
6
|
+
uses: alphagov/govuk-infrastructure/.github/workflows/codeql-analysis.yml@main
|
7
|
+
permissions:
|
8
|
+
security-events: write
|
9
|
+
|
10
|
+
dependency-review:
|
11
|
+
name: Dependency Review scan
|
12
|
+
uses: alphagov/govuk-infrastructure/.github/workflows/dependency-review.yml@main
|
13
|
+
|
4
14
|
# This matrix job runs the test suite against multiple Ruby versions
|
5
15
|
test_matrix:
|
6
16
|
strategy:
|
7
17
|
fail-fast: false
|
8
18
|
matrix:
|
9
|
-
|
10
|
-
ruby: ['3.0', 3.1, 3.2]
|
19
|
+
ruby: [3.1, 3.2, 3.3]
|
11
20
|
runs-on: ubuntu-latest
|
12
21
|
steps:
|
13
|
-
- uses: actions/checkout@
|
22
|
+
- uses: actions/checkout@v4
|
14
23
|
- uses: ruby/setup-ruby@v1
|
15
24
|
with:
|
16
25
|
ruby-version: ${{ matrix.ruby }}
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.1.4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 3.0.0
|
2
|
+
|
3
|
+
* Drop support for Ruby 3.0. The minimum required Ruby version is now 3.1
|
4
|
+
* **BREAKING CHANGE** No longer allow a GA custom dimension to be passed
|
5
|
+
when creating a GovukAbTesting::AbTest object. The dimension parameter
|
6
|
+
needs to be removed.
|
7
|
+
|
1
8
|
## 2.4.3
|
2
9
|
|
3
10
|
* Updated gem dependencies and development ruby version to 3.0.5
|
data/README.md
CHANGED
@@ -18,19 +18,18 @@ And then execute:
|
|
18
18
|
|
19
19
|
Before starting this, you'll need to:
|
20
20
|
|
21
|
-
- [Read the documentation](https://docs.publishing.service.gov.uk/manual/ab-testing.html) for an overview on how a/b testing works on GOV.UK.
|
21
|
+
- [Read the documentation](https://docs.publishing.service.gov.uk/manual/ab-testing.html) for an overview on how a/b testing works on GOV.UK.
|
22
22
|
- The cookie and header name in [govuk-cdn-config](https://github.com/alphagov/govuk-cdn-config/blob/master/ab_tests/ab_tests.yaml) must match the test name parameter that you pass to the Gem. The cookie name is case-sensitive.
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
-
### Outline
|
26
|
+
### Outline
|
27
27
|
|
28
28
|
To enable testing in the app, your Rails app needs:
|
29
29
|
|
30
30
|
1. [Some piece of logic to be A/B tested](#1-example-ab-test-logic)
|
31
31
|
2. [A response HTTP header that tells Fastly you're doing an A/B test](#2-http-response-header-to-fastly)
|
32
|
-
3. [A HTML meta tag that will be used to measure the results
|
33
|
-
the dimension to use in Google Analytics](#3-add-html-metatag-tags-to-your-layouts)
|
32
|
+
3. [A HTML meta tag that will be used to measure the results in Google Analytics](#3-add-html-metatag-tags-to-your-layouts)
|
34
33
|
|
35
34
|
### 1. Example A/B test logic
|
36
35
|
|
@@ -42,7 +41,6 @@ class PartyController < ApplicationController
|
|
42
41
|
def show
|
43
42
|
ab_test = GovukAbTesting::AbTest.new(
|
44
43
|
"your_ab_test_name",
|
45
|
-
dimension: 300,
|
46
44
|
allowed_variants: ['NoChange', 'LongTitle', 'ShortTitle'],
|
47
45
|
control_variant: 'NoChange'
|
48
46
|
)
|
@@ -63,7 +61,7 @@ end
|
|
63
61
|
|
64
62
|
In this example, we are running a multivariate test with 3 options being
|
65
63
|
tested: the existing version (control), and two title changes. The minimum
|
66
|
-
number of variants in any test should be two.
|
64
|
+
number of variants in any test should be two.
|
67
65
|
|
68
66
|
### 2. HTTP response header to Fastly
|
69
67
|
|
@@ -148,7 +146,6 @@ As with the `minitest` version, you can also pass in the following options to
|
|
148
146
|
`with_variant`:
|
149
147
|
|
150
148
|
- `assert_meta_tag: false`
|
151
|
-
- `dimension: <number>`
|
152
149
|
|
153
150
|
#### Minitest
|
154
151
|
|
@@ -200,7 +197,7 @@ class PartyControllerTest < ActionController::TestCase
|
|
200
197
|
include GovukAbTesting::MinitestHelpers
|
201
198
|
|
202
199
|
should "show the original" do
|
203
|
-
setup_ab_variant("your_ab_test_name", "B")
|
200
|
+
setup_ab_variant("your_ab_test_name", "B")
|
204
201
|
|
205
202
|
get :show
|
206
203
|
|
data/govuk_ab_testing.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "Gem to help with A/B testing on the GOV.UK platform"
|
13
13
|
spec.homepage = "https://github.com/alphagov/govuk_ab_testing"
|
14
14
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">= 3.
|
15
|
+
spec.required_ruby_version = ">= 3.1"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
18
|
f.match(%r{^(test|spec|features)/})
|
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_development_dependency "rake"
|
25
25
|
spec.add_development_dependency "rspec"
|
26
|
-
spec.add_development_dependency "rubocop-govuk", "
|
26
|
+
spec.add_development_dependency "rubocop-govuk", "5.0.2"
|
27
27
|
spec.add_development_dependency "yard"
|
28
28
|
end
|
@@ -1,18 +1,15 @@
|
|
1
1
|
module GovukAbTesting
|
2
2
|
class AbTest
|
3
|
-
attr_reader :ab_test_name, :
|
3
|
+
attr_reader :ab_test_name, :allowed_variants, :control_variant
|
4
4
|
|
5
5
|
alias_method :name, :ab_test_name
|
6
6
|
|
7
7
|
# @param request [String] the name of the A/B test
|
8
|
-
# @param dimension [Integer] the dimension registered with Google Analytics
|
9
|
-
# for this specific A/B test
|
10
8
|
# @param allowed_variants [Array] an array of Strings representing the
|
11
9
|
# possible variants
|
12
10
|
# @param control_variant [String] the control variant (typically 'A')
|
13
|
-
def initialize(ab_test_name,
|
11
|
+
def initialize(ab_test_name, allowed_variants: %w[A B], control_variant: "A")
|
14
12
|
@ab_test_name = ab_test_name
|
15
|
-
@dimension = dimension
|
16
13
|
@allowed_variants = allowed_variants
|
17
14
|
@control_variant = control_variant
|
18
15
|
end
|
@@ -20,7 +17,7 @@ module GovukAbTesting
|
|
20
17
|
# @param request [ActionDispatch::Http::Headers] the `request.headers` in
|
21
18
|
# the controller.
|
22
19
|
def requested_variant(request_headers)
|
23
|
-
RequestedVariant.new(self, request_headers
|
20
|
+
RequestedVariant.new(self, request_headers)
|
24
21
|
end
|
25
22
|
|
26
23
|
# Internal name of the header
|
@@ -6,26 +6,25 @@ module GovukAbTesting
|
|
6
6
|
|
7
7
|
def with_variant(args)
|
8
8
|
ab_test_name, variant = args.first
|
9
|
-
dimension = args[:dimension]
|
10
9
|
|
11
|
-
setup_ab_variant(ab_test_name, variant
|
10
|
+
setup_ab_variant(ab_test_name, variant)
|
12
11
|
|
13
12
|
yield
|
14
13
|
|
15
14
|
assert_response_is_cached_by_variant(ab_test_name)
|
16
15
|
|
17
16
|
unless args[:assert_meta_tag] == false
|
18
|
-
assert_page_tracked_in_ab_test(ab_test_name, variant
|
17
|
+
assert_page_tracked_in_ab_test(ab_test_name, variant)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
def setup_ab_variant(ab_test_name, variant
|
23
|
-
ab_test = AbTest.new(ab_test_name
|
21
|
+
def setup_ab_variant(ab_test_name, variant)
|
22
|
+
ab_test = AbTest.new(ab_test_name)
|
24
23
|
acceptance_test_framework.set_header(ab_test.request_header, variant)
|
25
24
|
end
|
26
25
|
|
27
26
|
def assert_response_is_cached_by_variant(ab_test_name)
|
28
|
-
ab_test = AbTest.new(ab_test_name
|
27
|
+
ab_test = AbTest.new(ab_test_name)
|
29
28
|
vary_header_value = acceptance_test_framework.vary_header
|
30
29
|
|
31
30
|
assert_contains_substring(
|
@@ -72,8 +71,8 @@ module GovukAbTesting
|
|
72
71
|
)
|
73
72
|
end
|
74
73
|
|
75
|
-
def assert_page_tracked_in_ab_test(ab_test_name, variant
|
76
|
-
ab_test = AbTest.new(ab_test_name
|
74
|
+
def assert_page_tracked_in_ab_test(ab_test_name, variant)
|
75
|
+
ab_test = AbTest.new(ab_test_name)
|
77
76
|
|
78
77
|
ab_test_meta_tags =
|
79
78
|
acceptance_test_framework.analytics_meta_tags_for_test(ab_test.name)
|
@@ -104,23 +103,6 @@ module GovukAbTesting
|
|
104
103
|
|
105
104
|
ERROR
|
106
105
|
)
|
107
|
-
|
108
|
-
assert_not_blank(
|
109
|
-
string: meta_tag.dimension,
|
110
|
-
error_message: <<-ERROR,
|
111
|
-
The meta tag dimension for the '#{ab_test_name}' A/B test is blank.
|
112
|
-
ERROR
|
113
|
-
)
|
114
|
-
|
115
|
-
unless ab_test.dimension.nil?
|
116
|
-
assert_is_equal(
|
117
|
-
expected: ab_test.dimension.to_s,
|
118
|
-
actual: meta_tag.dimension.to_s,
|
119
|
-
error_message: <<-ERROR,
|
120
|
-
The analytics meta tag for the '#{ab_test.name}' A/B test does not match the expected value.
|
121
|
-
ERROR
|
122
|
-
)
|
123
|
-
end
|
124
106
|
end
|
125
107
|
end
|
126
108
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module GovukAbTesting
|
2
2
|
module AcceptanceTests
|
3
3
|
class MetaTag
|
4
|
-
attr_reader :content
|
4
|
+
attr_reader :content
|
5
5
|
|
6
|
-
def initialize(content
|
6
|
+
def initialize(content:)
|
7
7
|
@content = content
|
8
|
-
@dimension = dimension
|
9
8
|
end
|
10
9
|
|
11
10
|
def for_ab_test?(ab_test_name)
|
@@ -17,7 +17,7 @@ module GovukAbTesting
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def assert_is_empty(enumerable:, error_message:)
|
20
|
-
assert_has_size(enumerable
|
20
|
+
assert_has_size(enumerable:, size: 0, error_message:)
|
21
21
|
end
|
22
22
|
|
23
23
|
def assert_not_blank(string:, error_message:)
|
@@ -5,12 +5,9 @@ module GovukAbTesting
|
|
5
5
|
# @param ab_test [AbTest] the A/B test being performed
|
6
6
|
# @param request_headers [ActionDispatch::Http::Headers] the
|
7
7
|
# `request.headers` in the controller.
|
8
|
-
|
9
|
-
# for this specific A/B test
|
10
|
-
def initialize(ab_test, request_headers, dimension)
|
8
|
+
def initialize(ab_test, request_headers)
|
11
9
|
@ab_test = ab_test
|
12
10
|
@request_headers = request_headers
|
13
|
-
@dimension = dimension
|
14
11
|
end
|
15
12
|
|
16
13
|
# Get the bucket this user is in
|
@@ -66,7 +63,6 @@ module GovukAbTesting
|
|
66
63
|
tag = <<~HTML
|
67
64
|
<meta name="govuk:ab-test"
|
68
65
|
content="#{ab_test.meta_tag_name}:#{variant_name}"
|
69
|
-
data-analytics-dimension="#{@dimension}"
|
70
66
|
data-allowed-variants="#{ab_test.allowed_variants.join(',')}">
|
71
67
|
HTML
|
72
68
|
|
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:
|
4
|
+
version: 3.0.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:
|
11
|
+
date: 2024-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.0.2
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.0.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,14 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
112
|
requirements:
|
113
113
|
- - ">="
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version: '3.
|
115
|
+
version: '3.1'
|
116
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
117
|
requirements:
|
118
118
|
- - ">="
|
119
119
|
- !ruby/object:Gem::Version
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
|
-
rubygems_version: 3.
|
122
|
+
rubygems_version: 3.5.17
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: Gem to help with A/B testing on the GOV.UK platform
|