datatrue_client 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a8a86b5463191029289d22ea6e5cde9fbcbb754e
4
+ data.tar.gz: 21d719983091ebfe5640e6ca553807782832f265
5
+ SHA512:
6
+ metadata.gz: 22532cb7a2f05c25b300e94d174076b283a535b62b13b5b2573fa50caa113fa1e687fe36e15f29096477b9f73beb212ea5fc4808f199fed99606af966ce8cf2e
7
+ data.tar.gz: 9a9fd0d9cb6d57976f024c27f3a96019ee2e0b591438adadeb77c1ba03b9029ff62bf9b182eb30279e42b36588c58f11799347d8658b4e13dddf47761783f964
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in datatrue_client.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Lens10 Pty Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,179 @@
1
+ # DataTrue API client
2
+
3
+ DataTrue is a SaaS platform to audit, monitor and validate tags, dataLayers and data collected from websites. The [DataTrue Test Builder chrome extension](https://chrome.google.com/webstore/detail/datatrue-test-builder/oghoceohpfhokhcoomihkobmpbcljall?hl=en) can quickly create test interactions with websites using our library of 100+ tag templates or custom tags. DataTrue works across complex AJAX interactions (e.g. using [AngularJS](https://angularjs.org/)), iframe content and multiple domains.
4
+
5
+ This ruby client allows you to trigger DataTrue tests from a Continuous Integration tool such as [Jenkins](https://jenkins.io/), [Teamcity](https://www.jetbrains.com/teamcity/), [Travis CI](https://travis-ci.org/), [Codeship](https://codeship.com/) and others. If you’re practicing Continuous Delivery, it can be used to trigger a test of your application as soon as changes are released.
6
+
7
+ ## Usage
8
+
9
+ You will need a DataTrue account ([free sign-up](https://datatrue.com/?utm_source=github&utm_medium=listing&utm_campaign=API_Client)) to use this gem. To get your API key go to the [Accounts page](https://datatrue.com/accounts/?utm_source=github&utm_medium=listing&utm_campaign=API_Client), select your account and click on "Generate API Key".
10
+
11
+ The next steps assume you have a test suite created in DataTrue. Read our [Knowledge Base](https://support.datatrue.com/hc/en-us/categories/200080049-Knowledge-Base?utm_source=github&utm_medium=listing&utm_campaign=API_Client) to find-out [how to quickly create a single-page test](https://support.datatrue.com/hc/en-us/articles/213538568-1-Use-Quick-Start-to-create-a-single-page-test?utm_source=github&utm_medium=listing&utm_campaign=API_Client).
12
+
13
+ Install the gem on the system you want to trigger your tests from:
14
+
15
+ $ gem install datatrue_client
16
+
17
+ Alternatively, if you want to include the client as part of your ruby application, you can add this line to your Gemfile:
18
+
19
+ ```ruby
20
+ gem 'datatrue_client', :group => [:test, :development]
21
+ ```
22
+
23
+ ### Command-line usage
24
+
25
+ Use the [DataTrue API wizard](https://datatrue.com/?utm_source=github&utm_medium=listing&utm_campaign=API_Client) to select your test(s) or test suite along with other options. Paste the command-line in your terminal to see it in action; e.g.:
26
+
27
+ ```
28
+ datatrue_client run 1539 -a rtTlaqucG9RrTg1G2L1O0u -t suite \
29
+ -v HOSTNAME=datatrue.com,GTMID=GTM-ABCXYZ \
30
+ -e 543,544
31
+
32
+ datatrue_client: job=5e9316aa116b4a6fe5dfebda68accd60 created for test="DataTrue Public pages"
33
+ datatrue_client: test_run_id=52454 step=1 total_steps=7 result=running
34
+ datatrue_client: test_run_id=52454 step=1 total_steps=7 result=passed
35
+ ...
36
+ datatrue_client: test_run_id=52454 step=7 total_steps=7 result=passed
37
+ datatrue_client: test_run_id=52454 finished result=passed.
38
+ ```
39
+
40
+ The exit status of the application will change according to test results:
41
+ * `0`: test run successful, result=passed.
42
+ * `1`: test run successful, result=failed.
43
+ * `-1`: generic test run error. See output detail.
44
+ * `-2`: authentication or authorisation error. Check your API key and test identifiers.
45
+ * `-3`: quota exceeded. You have used-up all your subscription allowance for this period.
46
+
47
+ If you want to ignore the exit status, use the shell's `||` operator; e.g.: `datatrue_client [options] || true`. This will ensure that the exit status is always `0`.
48
+
49
+ `datatrue_client <command> [command-arguments] -a <api_key> [command-options]`
50
+
51
+ _Commands_:
52
+
53
+ * `run`: triggers a new run of tests or a test suite and waits for it to finish.
54
+
55
+ ```text
56
+ datatrue_client run <suite_id | test_id_1,test_id_2,...> -a <api_key>
57
+ [-t | --type=suite|test] [-v | --variables foo=bar,thunder=flash]
58
+ [-e | --email-users '1,2,3...'] [-o | --output [filename]] [-s | --silent]
59
+ ```
60
+
61
+ * `trigger`: triggers a new run of tests or a test suite and exits immediately.
62
+
63
+ ```text
64
+ datatrue_client trigger <suite_id | test_id_1,test_id_2,...> -a <api_key>
65
+ [-t | --type=suite|test] [-v | --variables foo=bar,thunder=flash]
66
+ [-s | --silent]
67
+ ```
68
+
69
+ _Options_:
70
+
71
+ * `-a` or `--api-key`: The DataTrue API key. Overrides the API key provided as an environment variable.
72
+ * `-t` or `--type`: The type of test to be run. Valid options are `test` or `suite`.
73
+ * `-v` or `--variables`: Variables provided to the test. These can be used to change behaviour of your test, provide credentials and more.
74
+ * `-e` or `--email-users`: Comma-separated list of user identifiers who will receive an email with the test results.
75
+ * `-o` or `--output`: write the test results as a JUnit XML report that can be used to integrate DataTrue test results with other test tools (e.g. Jenkins). If no filename is provided the client will create a `<job_id>.xml`.
76
+ * `-s` or `--silent`: suppress all application output.
77
+
78
+ #### Environment variables
79
+
80
+ * `DATATRUE_API_KEY`: your DataTrue API key. The `-a` option takes precedence.
81
+
82
+ ### Usage in a Ruby application
83
+
84
+ Trigger a test run:
85
+
86
+ ```
87
+ test_run = DatatrueClient::TestRun.new({
88
+ host: 'localhost:3000',
89
+ scheme: 'http',
90
+ api_key: '_AHQZRHZ3kD0kpa0Al-SJg', # please remember to generate your own key on datatrue.com
91
+
92
+ test_run: {
93
+ test_class: 'TestScenario',
94
+ test_id: 1
95
+ },
96
+ variables: {
97
+ key: value
98
+ },
99
+
100
+ polling_interval: 2, # in seconds, 2 by default
101
+ polling_timeout: 120 # in seconds, 60 by default
102
+ })
103
+ ```
104
+
105
+ Query progress:
106
+
107
+ ```
108
+ test_run.query_progress
109
+
110
+ # returns the progress hash
111
+ #
112
+ # {
113
+ # time: 1463359905,
114
+ # status: "working",
115
+ # uuid: "a1f7868b1db44d38c16585ce37e4ac3f",
116
+ # num: 4,
117
+ # total: 5,
118
+ # progress: {
119
+ # percentage: 80,
120
+ # tests: [
121
+ # {
122
+ # id: 1,
123
+ # name: "Test name",
124
+ # state: "running",
125
+ # steps_completed: 4,
126
+ # steps: [
127
+ # {
128
+ # name: "Step name",
129
+ # running: false,
130
+ # pending: false,
131
+ # error: nil,
132
+ # tags: [
133
+ # { name: "Tag name', enabled: true, valid: true },
134
+ # ...
135
+ # ]
136
+ # },
137
+ # ...
138
+ # ]
139
+ # },
140
+ # ...
141
+ # ]
142
+ # }
143
+ # }
144
+ ```
145
+
146
+ Poll progress (blocks until the run is finished or timed out):
147
+
148
+ `test_run.poll_progress`
149
+
150
+ ### Jenkins Integration
151
+
152
+ The DataTrue client can output test results in the [JUnit format](https://github.com/windyroad/JUnit-Schema/blob/master/JUnit.xsd) which can then be parsed by the [Jenkins JUnit plugin](https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin) and incorporated into your test results.
153
+
154
+ Here's an example of what the results look like in Jenkins v1.6.
155
+
156
+ <img src="documentation/jenkins_datatrue_test_result_summary.png?raw=true" alt="DataTrue test result summary in Jenkins" height="400"/>
157
+
158
+
159
+ ## Support
160
+
161
+ Our [support website](https://support.datatrue.com/?utm_source=github&utm_medium=listing&utm_campaign=API_Client) has more detailed information about DataTrue and the API client.
162
+
163
+ If you believe you have found a bug, please [reach-out using the support website](https://support.datatrue.com/hc/en-us/requests/new?utm_source=github&utm_medium=listing&utm_campaign=API_Client) or through support@datatrue.com.
164
+
165
+ ## Contributing
166
+
167
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Lens10/datatrue_client.
168
+
169
+
170
+ ### Development
171
+
172
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
173
+
174
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
175
+
176
+
177
+ ## License
178
+
179
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "datatrue_client"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'datatrue_client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "datatrue_client"
8
+ spec.version = DatatrueClient::VERSION
9
+ spec.authors = ["Ziyu Wang"]
10
+ spec.email = ["odduid@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby wrapper for DataTrue REST API.}
13
+ spec.description = %q{This ruby client allows you to trigger DataTrue tests from a Continuous Integration tool such as Jenkins, Teamcity, Travis CI, Codeship and others. If you’re practicing Continuous Delivery, it can be used to trigger a test of your application as soon as changes are released.}
14
+ spec.homepage = "https://datatrue.com"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.11"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "webmock", "~> 2.0", ">= 2.0.1"
26
+
27
+ spec.add_dependency "rest-client", "~> 1.6"
28
+ end
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "optparse"
5
+ require 'ostruct'
6
+ require "datatrue_client"
7
+
8
+ COMMANDS = ['run', 'trigger']
9
+ TYPES = ['test', 'suite']
10
+
11
+ def parse(args)
12
+ # The options specified on the command line will be collected in *options*.
13
+ options = OpenStruct.new
14
+ options.variables = {}
15
+ options.email_user_ids = []
16
+ options.silent = false
17
+
18
+ opt_parser = OptionParser.new do |opts|
19
+ opts.banner = "Usage: datatrue_client command(#{COMMANDS.join('|')}) id [options]"
20
+
21
+ opts.separator ""
22
+ opts.separator "The run command triggers a new run of test or test suite and waits for it to finish. The trigger command triggers a new run of test or test suite and exits immediately. Below are common options for run and trigger:"
23
+
24
+ opts.on("-a", "--api-key [KEY]",
25
+ "The DataTrue API key.",
26
+ "Overrides the API key provided as an environment variable.") do |key|
27
+ options.api_key = key
28
+ end
29
+
30
+ opts.on("-t", "--type TYPE", TYPES,
31
+ "The type of test to be run (#{TYPES.join(', ')})") do |t|
32
+ case t
33
+ when 'test'
34
+ options.type = 'TestScenario'
35
+ when 'suite'
36
+ options.type = 'Suite'
37
+ end
38
+ end
39
+
40
+ opts.on("--host [HOST]", "API host") do |h|
41
+ options.host = h
42
+ end
43
+
44
+ opts.on("--scheme [SCHEME]", "API host scheme") do |s|
45
+ options.scheme = s
46
+ end
47
+
48
+ opts.on("--variables [key=value,...]", Array,
49
+ "Variables provided to the test.",
50
+ "These can be used to change behaviour of your test, provide credentials and more.") do |list|
51
+ (list || []).each do |variable|
52
+ pair = variable.split('=')
53
+ options.variables[pair[0].to_sym] = pair[1]
54
+ end
55
+ end
56
+
57
+ opts.on("--email-users [1,2,...]", Array,
58
+ "Comma-separated list of user ids who will receive an email with the test results.") do |list|
59
+ (list || []).each do |id|
60
+ options.email_user_ids << Integer(id)
61
+ end
62
+ end
63
+
64
+ opts.on("-s", "--silent", "Suppress all application output.") do |s|
65
+ options.silent = s
66
+ end
67
+
68
+ opts.separator ""
69
+ opts.separator "Specific options for run:"
70
+
71
+ opts.on("--timeout [TIMEOUT]", "Time to wait before the run finishes.") do |t|
72
+ options.polling_timeout = t
73
+ end
74
+
75
+ opts.separator ""
76
+ opts.separator "Common options:"
77
+
78
+ opts.on_tail("-h", "--help", "Show this message") do
79
+ puts opts
80
+ exit
81
+ end
82
+
83
+ opts.on_tail("--version", "Show version") do
84
+ puts DatatrueClient::VERSION
85
+ exit
86
+ end
87
+ end
88
+
89
+ opt_parser.parse!(args)
90
+ options
91
+ end
92
+
93
+ def datatrue_print(message)
94
+ puts "datatrue_client: #{message}"
95
+ end
96
+
97
+ def process_result(details)
98
+ if details[:status] == 'completed'
99
+ if details[:progress]['tests'].all? { |result| ['success', 'validated'].include? result['state'] }
100
+ status = 'passed'
101
+ else
102
+ status = 'failed'
103
+ end
104
+ else
105
+ status = details[:status]
106
+ end
107
+ end
108
+
109
+ begin
110
+ options = parse(ARGV)
111
+ command = ARGV.shift
112
+ id = ARGV.shift
113
+
114
+ # Check mandatory inputs
115
+ if command.nil? || !COMMANDS.include?(command)
116
+ datatrue_print "missing or invalid command. Run 'datatrue_client --help' for instructions."
117
+ exit
118
+ end
119
+ if id.nil?
120
+ datatrue_print "missing id."
121
+ exit
122
+ end
123
+ if options.type.nil?
124
+ datatrue_print "missing type. Possible types #{TYPES.join(', ')}."
125
+ exit
126
+ end
127
+
128
+ datatrue_print_progress = Proc.new do |progress, details|
129
+ datatrue_print %{
130
+ test_run_id=#{details[:options]['test_run_id']}
131
+ step=#{details[:num]}
132
+ total_steps=#{details[:total]}
133
+ result=#{process_result(details)}
134
+ }.gsub(/\s+/, ' ').strip
135
+ end
136
+
137
+ test_run = DatatrueClient::TestRun.new({
138
+ host: options.host,
139
+ scheme: options.scheme,
140
+ api_key: options.api_key || ENV['DATATRUE_API_KEY'],
141
+
142
+ test_run: {
143
+ test_class: options.type,
144
+ test_id: Integer(id),
145
+ email_users: options.email_user_ids
146
+ },
147
+ variables: options.variables,
148
+
149
+ polling_timeout: options.polling_timeout ? Integer(options.polling_timeout) : nil
150
+ })
151
+ datatrue_print "job=#{test_run.job_id} created for test=\"#{test_run.title}\"" unless options.silent
152
+
153
+ if command == 'run'
154
+ res = test_run.poll_progress(options.silent ? nil : datatrue_print_progress)
155
+ process_result(res) == 'passed' ? exit : exit(1)
156
+ else
157
+ exit
158
+ end
159
+ rescue RestClient::Unauthorized => e
160
+ datatrue_print e.message
161
+ exit(-2)
162
+ rescue DatatrueClient::QuotaExceeded => e
163
+ datatrue_print e.message
164
+ exit(-3)
165
+ rescue => e
166
+ datatrue_print e.message
167
+ exit(-1)
168
+ end
@@ -0,0 +1,6 @@
1
+ require "datatrue_client/version"
2
+ require "datatrue_client/test_run"
3
+
4
+ module DatatrueClient
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,111 @@
1
+ require 'addressable/uri'
2
+ require 'rest-client'
3
+ require 'json'
4
+
5
+ module DatatrueClient
6
+
7
+ # Abstracts HTTP details of DataTrueClient commands, all methods are synchronous
8
+ class Bridge
9
+ attr_accessor :host, :scheme
10
+
11
+ def initialize(options={})
12
+ @host = options[:host] || 'datatrue.com'
13
+ @scheme = options[:scheme] || 'https'
14
+ @api_key = options[:api_key]
15
+ end
16
+
17
+ # Creates and queues a DataTrue test run
18
+ # @param payload [Hash]
19
+ # payload = {
20
+ # test_run: {
21
+ # test_class: 'TestScenario',
22
+ # test_id: '1',
23
+ # email_users: [1, ...]
24
+ # },
25
+ # variables: {
26
+ # name: value,
27
+ # ...
28
+ # }
29
+ # }
30
+ # @return [Hash] data about created test run, including job_id
31
+ def create_test_run(payload)
32
+ post("test_runs", payload)
33
+ end
34
+
35
+ # Queries test run progress
36
+ # @param job_id [String] test run job id
37
+ # @return [Hash] data about progress
38
+ # {
39
+ # time: 1463359905,
40
+ # status: "working",
41
+ # uuid: "a1f7868b1db44d38c16585ce37e4ac3f",
42
+ # num: 4,
43
+ # total: 5,
44
+ # progress: {
45
+ # percentage: 80,
46
+ # tests: [
47
+ # {
48
+ # id: 1,
49
+ # name: "Test name",
50
+ # state: "running",
51
+ # steps_completed: 4,
52
+ # steps: [
53
+ # {
54
+ # name: "Step name",
55
+ # running: false,
56
+ # pending: false,
57
+ # error: nil,
58
+ # tags: [
59
+ # { name: "Tag name', enabled: true, valid: true },
60
+ # ...
61
+ # ]
62
+ # },
63
+ # ...
64
+ # ]
65
+ # },
66
+ # ...
67
+ # ]
68
+ # }
69
+ # }
70
+ def test_run_progress(job_id)
71
+ get("test_runs/progress/#{job_id}")
72
+ end
73
+
74
+ private
75
+
76
+ def url(path)
77
+ Addressable::URI.parse("#{scheme}://#{host}/ci_api/#{path}?api_key=#{@api_key}").normalize.to_str
78
+ end
79
+
80
+ # Sends a GET request to url(path)
81
+ # @param path [String] the request path
82
+ # @return [Hash] parsed response body as a hash
83
+ def get(path)
84
+ parse_response RestClient.get(url(path), { accept: :json })
85
+ end
86
+
87
+ # Sends a POST request to url(path)
88
+ # @param path [String] the request path
89
+ # @param payload [Hash] data which will be converted to json and send in request body
90
+ # @return [Hash] parsed response body as a hash
91
+ def post(path, payload)
92
+ res = RestClient.post url(path), payload.to_json, { content_type: :json, accept: :json }
93
+ parse_response(res)
94
+ end
95
+
96
+ # Parses json string to a hash and tries to convert keys to symbols
97
+ # @param res [String] RestClient response / json string
98
+ # @return [Hash] parsed hash
99
+ def parse_response(res)
100
+ hash = JSON.parse(res)
101
+
102
+ # convert keys to symbols
103
+ hash.keys.each do |key|
104
+ hash[(key.to_sym rescue key) || key] = hash.delete(key)
105
+ end
106
+
107
+ hash
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,79 @@
1
+ require "datatrue_client/bridge"
2
+
3
+ module DatatrueClient
4
+ class TimeoutError < StandardError; end
5
+ class QuotaExceeded < StandardError; end
6
+
7
+ class TestRun
8
+ attr_reader :job_id, :title, :progress
9
+ attr_accessor :polling_timeout, :polling_interval
10
+
11
+ # @param options [Hash]
12
+ # options = {
13
+ # polling_interval: 0.1,
14
+ # polling_timeout: 1
15
+ # }
16
+ # options will also be passed to `Bridge.new` and `Bridge#create_test_run`,
17
+ # see `Bridge` for other possible option keys
18
+ def initialize(options={})
19
+ @options = options
20
+ @bridge = Bridge.new(options)
21
+
22
+ @polling_timeout = options[:polling_timeout] || 60
23
+ @polling_interval = options[:polling_interval] || 2
24
+
25
+ create
26
+ end
27
+
28
+ # Queries test run progress
29
+ # @return [Hash] data about progress
30
+ def query_progress
31
+ @bridge.test_run_progress(job_id)
32
+ end
33
+
34
+ # Keeps querying progress until progress status is `complete`
35
+ # @param print_progress [Proc] called with current progress percentage and details
36
+ def poll_progress(print_progress=nil)
37
+ start_time = DateTime.now
38
+
39
+ loop do
40
+ res = query_progress
41
+ @progress = progress_percentage(res)
42
+ print_progress.call(@progress, res) if print_progress
43
+
44
+ return res if res[:status] == 'completed'
45
+
46
+ if elapsed_milliseconds(start_time, DateTime.now) >= @polling_timeout * 1000
47
+ raise TimeoutError.new("Polling progress timed out after #{@polling_timeout} seconds")
48
+
49
+ break
50
+ else
51
+ sleep @polling_interval
52
+ end
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def create
59
+ res = @bridge.create_test_run(@options)
60
+ @job_id = res[:job_id]
61
+ @title = res[:title]
62
+ end
63
+
64
+ def progress_percentage(progress_res)
65
+ if progress_res[:status] == 'queued'
66
+ 0
67
+ elsif progress_res[:status] == 'completed'
68
+ raise QuotaExceeded.new(progress_res[:error]) if progress_res[:error]
69
+ 100
70
+ else
71
+ progress_res[:progress].nil? ? 0 : progress_res[:progress][:percentage]
72
+ end
73
+ end
74
+
75
+ def elapsed_milliseconds(start_time, end_time)
76
+ ((end_time - start_time) * 24 * 60 * 60 * 1000).to_i
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module DatatrueClient
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: datatrue_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ziyu Wang
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.0.1
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '2.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.0.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: rest-client
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.6'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.6'
89
+ description: This ruby client allows you to trigger DataTrue tests from a Continuous
90
+ Integration tool such as Jenkins, Teamcity, Travis CI, Codeship and others. If you’re
91
+ practicing Continuous Delivery, it can be used to trigger a test of your application
92
+ as soon as changes are released.
93
+ email:
94
+ - odduid@gmail.com
95
+ executables:
96
+ - datatrue_client
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - ".gitignore"
101
+ - ".rspec"
102
+ - ".travis.yml"
103
+ - Gemfile
104
+ - LICENSE.txt
105
+ - README.md
106
+ - Rakefile
107
+ - bin/console
108
+ - bin/setup
109
+ - datatrue_client.gemspec
110
+ - documentation/jenkins_datatrue_test_result_summary.png
111
+ - exe/datatrue_client
112
+ - lib/datatrue_client.rb
113
+ - lib/datatrue_client/bridge.rb
114
+ - lib/datatrue_client/test_run.rb
115
+ - lib/datatrue_client/version.rb
116
+ homepage: https://datatrue.com
117
+ licenses:
118
+ - MIT
119
+ metadata: {}
120
+ post_install_message:
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 2.4.8
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Ruby wrapper for DataTrue REST API.
140
+ test_files: []
141
+ has_rdoc: