rtrail 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +96 -0
- data/lib/rtrail.rb +19 -0
- data/lib/rtrail/api.rb +42 -0
- data/lib/rtrail/case.rb +8 -0
- data/lib/rtrail/client.rb +113 -0
- data/lib/rtrail/entity.rb +65 -0
- data/lib/rtrail/exceptions.rb +4 -0
- data/lib/rtrail/helpers.rb +32 -0
- data/lib/rtrail/plan.rb +7 -0
- data/lib/rtrail/project.rb +83 -0
- data/lib/rtrail/result.rb +9 -0
- data/lib/rtrail/run.rb +39 -0
- data/lib/rtrail/section.rb +7 -0
- data/lib/rtrail/suite.rb +26 -0
- data/lib/rtrail/test.rb +22 -0
- data/mock/app.rb +55 -0
- data/mock/views/add_result/1.yajl +4 -0
- data/mock/views/add_run/1.yajl +7 -0
- data/mock/views/error.yajl +3 -0
- data/mock/views/get_case/1.yajl +4 -0
- data/mock/views/get_cases/1.yajl +3 -0
- data/mock/views/get_plan/1.yajl +4 -0
- data/mock/views/get_plans/1.yajl +3 -0
- data/mock/views/get_project/1.yajl +4 -0
- data/mock/views/get_project/2.yajl +4 -0
- data/mock/views/get_projects.yajl +4 -0
- data/mock/views/get_result/1.yajl +4 -0
- data/mock/views/get_results/1.yajl +3 -0
- data/mock/views/get_run/1.yajl +7 -0
- data/mock/views/get_run/2.yajl +7 -0
- data/mock/views/get_runs/1.yajl +4 -0
- data/mock/views/get_section/1.yajl +9 -0
- data/mock/views/get_section/2.yajl +9 -0
- data/mock/views/get_sections/1.yajl +4 -0
- data/mock/views/get_suite/1.yajl +6 -0
- data/mock/views/get_suite/2.yajl +5 -0
- data/mock/views/get_suite/3.yajl +6 -0
- data/mock/views/get_suites/1.yajl +4 -0
- data/mock/views/get_suites/2.yajl +4 -0
- data/mock/views/get_test/1.yajl +4 -0
- data/mock/views/get_test/2.yajl +4 -0
- data/mock/views/get_tests/1.yajl +5 -0
- data/rtrail.gemspec +41 -0
- data/spec/api_spec.rb +46 -0
- data/spec/case_spec.rb +12 -0
- data/spec/client_spec.rb +43 -0
- data/spec/entity_spec.rb +12 -0
- data/spec/helpers_spec.rb +52 -0
- data/spec/plan_spec.rb +12 -0
- data/spec/project_spec.rb +132 -0
- data/spec/result_spec.rb +12 -0
- data/spec/run_spec.rb +61 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/suite_spec.rb +29 -0
- data/spec/test_spec.rb +34 -0
- metadata +258 -0
data/spec/api_spec.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe API do
|
5
|
+
let(:api) { API.new("http://localhost:8080/", "user", "password") }
|
6
|
+
|
7
|
+
describe "#initialize" do
|
8
|
+
it "initializes the client" do
|
9
|
+
expect(api.client).to_not be_nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#projects" do
|
14
|
+
it "returns all Projects" do
|
15
|
+
projects = api.projects
|
16
|
+
expect(projects).to be_an(Array)
|
17
|
+
expect(projects.first).to be_a(Project)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#project" do
|
22
|
+
it "returns a Project instance" do
|
23
|
+
project = api.project("First Project")
|
24
|
+
expect(project).to be_a(Project)
|
25
|
+
expect(project.name).to eq("First Project")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#runs" do
|
30
|
+
it "returns all Runs for the given Project" do
|
31
|
+
runs = api.runs("First Project")
|
32
|
+
expect(runs).to be_an(Array)
|
33
|
+
expect(runs.first).to be_a(Run)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#cases" do
|
38
|
+
it "returns all Cases for the given Project and Suite" do
|
39
|
+
cases = api.cases("First Project", "First Suite")
|
40
|
+
expect(cases).to be_an(Array)
|
41
|
+
expect(cases.first).to be_a(Case)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end # module RTrail
|
46
|
+
|
data/spec/case_spec.rb
ADDED
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe Client do
|
5
|
+
let(:base_url) { MOCK_APP_URL }
|
6
|
+
let(:user) { "somebody" }
|
7
|
+
let(:password) { "pa$$w0rd1" }
|
8
|
+
let(:client) { Client.new(base_url, user, password) }
|
9
|
+
|
10
|
+
describe "#initialize" do
|
11
|
+
it "sets base_url, user, and password attributes" do
|
12
|
+
expect(client.base_url).to eq(base_url)
|
13
|
+
expect(client.user).to eq(user)
|
14
|
+
expect(client.password).to eq(password)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#get" do
|
19
|
+
it "sends a GET request" do
|
20
|
+
expect(client).to receive(:_request).with(:get, 'get_project/1')
|
21
|
+
client.get("get_project/1")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "raises RTrail::Error when GET object is not found" do
|
25
|
+
expect {
|
26
|
+
client.get("get_project/999")
|
27
|
+
}.to raise_error(RTrail::Error)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#post" do
|
32
|
+
it "sends a POST request" do
|
33
|
+
fields = {
|
34
|
+
:suite_id => 1,
|
35
|
+
:name => "Test Run",
|
36
|
+
}
|
37
|
+
expect(client).to receive(:_request).with(:post, 'add_run/1', fields)
|
38
|
+
client.post("add_run/1", fields)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end # module RTrail
|
43
|
+
|
data/spec/entity_spec.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require 'hashie'
|
3
|
+
|
4
|
+
module RTrail
|
5
|
+
describe Helpers do
|
6
|
+
class Thing < Hashie::Mash
|
7
|
+
include RTrail::Helpers
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:thing) { Thing.new }
|
11
|
+
|
12
|
+
describe "#is_id?" do
|
13
|
+
it "returns true for numeric strings" do
|
14
|
+
expect(thing.is_id?('0')).to be true
|
15
|
+
expect(thing.is_id?('4')).to be true
|
16
|
+
expect(thing.is_id?('117')).to be true
|
17
|
+
expect(thing.is_id?('62521')).to be true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns false for non-numeric strings" do
|
21
|
+
expect(thing.is_id?('')).to be false
|
22
|
+
expect(thing.is_id?('x')).to be false
|
23
|
+
expect(thing.is_id?('Foobar')).to be false
|
24
|
+
expect(thing.is_id?('This sentence no verb')).to be false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#path_with_params" do
|
29
|
+
it "appends params to the path using TestRail's GET syntax" do
|
30
|
+
result = thing.path_with_params("/add_run/1", :suite_id => 4)
|
31
|
+
expect(result).to eq("/add_run/1&suite_id=4")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe Helpers::HasCreateTime do
|
36
|
+
class Thing < Hashie::Mash
|
37
|
+
include RTrail::Helpers::HasCreateTime
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:now) { Time.utc(2014, 'may', 19, 3, 45, 0) }
|
41
|
+
let(:thing) { Thing.new(:created_on => now.to_i) }
|
42
|
+
|
43
|
+
describe "#create_time" do
|
44
|
+
it "returns the `created_on` attribute as a Time" do
|
45
|
+
expect(thing.create_time).to be_a(Time)
|
46
|
+
expect(thing.create_time).to eq(now)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end # module RTrail
|
52
|
+
|
data/spec/plan_spec.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe Project do
|
5
|
+
context "Class methods" do
|
6
|
+
describe "#all" do
|
7
|
+
it "returns all Projects" do
|
8
|
+
projects = Project.all
|
9
|
+
expect(projects).to be_an(Array)
|
10
|
+
expect(projects.first).to be_a(Project)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#by_name" do
|
15
|
+
it "returns the Project with the given name if it exists" do
|
16
|
+
project = Project.by_name("First Project")
|
17
|
+
expect(project).to be_a(Project)
|
18
|
+
expect(project).to_not be_nil
|
19
|
+
expect(project.name).to eq("First Project")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "raises RTrail::NotFound if no project exists with the given name" do
|
23
|
+
expect {
|
24
|
+
Project.by_name("Bogus Project Name")
|
25
|
+
}.to raise_error(RTrail::NotFound, /not found in TestRail/)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "Instance methods" do
|
31
|
+
let(:project1) { Project.new(1) }
|
32
|
+
let(:project2) { Project.new(2) }
|
33
|
+
|
34
|
+
describe "#initialize" do
|
35
|
+
it "gets the Project data" do
|
36
|
+
expect(project1.id).to eq(1)
|
37
|
+
expect(project1.name).to eq("First Project")
|
38
|
+
expect(project2.id).to eq(2)
|
39
|
+
expect(project2.name).to eq("Second Project")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#suite_by_name" do
|
44
|
+
it "gets the Suite with the given name if it exists" do
|
45
|
+
suite = project1.suite_by_name("First Suite")
|
46
|
+
expect(suite).to be_a(Suite)
|
47
|
+
expect(suite.name).to eq("First Suite")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "raises RTrail::NotFound if no suite exists with the given name" do
|
51
|
+
expect {
|
52
|
+
project1.suite_by_name("Third Suite")
|
53
|
+
}.to raise_error(RTrail::NotFound, /not found in project/)
|
54
|
+
expect {
|
55
|
+
project2.suite_by_name("First Suite")
|
56
|
+
}.to raise_error(RTrail::NotFound, /not found in project/)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#suite" do
|
61
|
+
it "returns a Suite by id" do
|
62
|
+
suite = project1.suite(1)
|
63
|
+
expect(suite).to be_a(Suite)
|
64
|
+
expect(suite.id).to eq(1)
|
65
|
+
expect(suite.name).to eq("First Suite")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "returns a Suite by name" do
|
69
|
+
suite = project1.suite("First Suite")
|
70
|
+
expect(suite).to be_a(Suite)
|
71
|
+
expect(suite.id).to eq(1)
|
72
|
+
expect(suite.name).to eq("First Suite")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#suite_id" do
|
77
|
+
it "returns the id for a Suite" do
|
78
|
+
suite_id = project1.suite_id("First Suite")
|
79
|
+
expect(suite_id).to eq(1)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#plans" do
|
84
|
+
it "returns all Plans in the Project" do
|
85
|
+
plans = project1.plans
|
86
|
+
expect(plans).to be_an(Array)
|
87
|
+
expect(plans.count).to eq(1)
|
88
|
+
expect(plans.first).to be_a(Plan)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#runs" do
|
93
|
+
it "returns all Runs in the Project" do
|
94
|
+
runs = project1.runs
|
95
|
+
expect(runs.count).to eq(2)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#suites" do
|
100
|
+
it "returns all Suites in the project" do
|
101
|
+
suites = project1.suites
|
102
|
+
expect(suites.count).to eq(2)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#run" do
|
107
|
+
it "returns an existing Run with the same name" do
|
108
|
+
run = project1.run("First Suite", "First Run")
|
109
|
+
expect(run).to be_a(Run)
|
110
|
+
expect(run.id).to eq(1)
|
111
|
+
expect(run.suite_id).to eq(1)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "creates a new Run and returns it" do
|
115
|
+
run = project1.run("First Suite", "New Run Name")
|
116
|
+
expect(run).to be_a(Run)
|
117
|
+
expect(run.suite_id).to eq(1)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#add_run" do
|
122
|
+
it "returns the new Run" do
|
123
|
+
run = project1.add_run("First Suite", :name => "New Run Name")
|
124
|
+
expect(run).to be_a(Run)
|
125
|
+
expect(run.suite_id).to eq(1)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
end # module RTrail
|
132
|
+
|
data/spec/result_spec.rb
ADDED
data/spec/run_spec.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe Run do
|
5
|
+
context "Class methods" do
|
6
|
+
end
|
7
|
+
|
8
|
+
context "Instance methods" do
|
9
|
+
let(:run1) { Run.new(1) }
|
10
|
+
let(:run2) { Run.new(2) }
|
11
|
+
|
12
|
+
describe "#initialize" do
|
13
|
+
it "gets the Run data" do
|
14
|
+
expect(run1.id).to eq(1)
|
15
|
+
expect(run2.id).to eq(2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#summary" do
|
20
|
+
it "includes id and name" do
|
21
|
+
expect(run1.summary).to include(run1.id.to_s)
|
22
|
+
expect(run1.summary).to include(run1.name)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "includes completion status" do
|
26
|
+
expect(run1.summary).to include("[completed")
|
27
|
+
expect(run2.summary).to include("[not completed")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#tests" do
|
32
|
+
it "includes all Tests in the Run" do
|
33
|
+
expect(run1.tests).to be_an(Array)
|
34
|
+
expect(run1.tests.first).to be_a(Test)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#complete_time" do
|
39
|
+
it "returns a Time if `completed_on` is set" do
|
40
|
+
expect(run1.complete_time).to be_a(Time)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns nil if `completed_on` is nil" do
|
44
|
+
expect(run2.complete_time).to be_nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#completed?" do
|
49
|
+
it "returns true if `completed_on` is set" do
|
50
|
+
expect(run1.completed?).to be true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns false if `completed_on` is nil" do
|
54
|
+
expect(run2.completed?).to be false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # module RTrail
|
61
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start if ENV['COVERAGE']
|
3
|
+
|
4
|
+
PROJECT_ROOT = File.expand_path('..', File.dirname(__FILE__))
|
5
|
+
SPEC_DIR = File.join(PROJECT_ROOT, 'spec')
|
6
|
+
MOCK_APP_URL = "http://localhost:8080/index.php?/api/v2/"
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.join(PROJECT_ROOT, 'lib'))
|
9
|
+
require 'rtrail'
|
10
|
+
|
11
|
+
module SpecHelpers
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.include SpecHelpers
|
16
|
+
config.before(:all) do
|
17
|
+
RTrail::Entity.client = RTrail::Client.new(MOCK_APP_URL, 'user', 'password')
|
18
|
+
end
|
19
|
+
end
|
data/spec/suite_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe Suite do
|
5
|
+
context "Class methods" do
|
6
|
+
end
|
7
|
+
|
8
|
+
context "Instance methods" do
|
9
|
+
let(:suite) { Suite.new(1) }
|
10
|
+
|
11
|
+
describe "#sections" do
|
12
|
+
let(:sections) { suite.sections }
|
13
|
+
it "returns all Sections in the Suite" do
|
14
|
+
expect(sections).to be_an(Array)
|
15
|
+
expect(sections.first).to be_a(Section)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#cases" do
|
20
|
+
let(:cases) { suite.cases }
|
21
|
+
it "returns all Cases in the Suite" do
|
22
|
+
expect(cases).to be_an(Array)
|
23
|
+
expect(cases.first).to be_a(Case)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end # module RTrail
|
29
|
+
|
data/spec/test_spec.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module RTrail
|
4
|
+
describe Test do
|
5
|
+
context "Class methods" do
|
6
|
+
end
|
7
|
+
|
8
|
+
context "Instance methods" do
|
9
|
+
let(:test) { Test.new(1) }
|
10
|
+
|
11
|
+
describe "#results" do
|
12
|
+
let(:results) { test.results }
|
13
|
+
it "returns all Results for the Test" do
|
14
|
+
expect(results).to be_an(Array)
|
15
|
+
expect(results.first).to be_a(Result)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#latest_result" do
|
20
|
+
let(:latest_result) { test.latest_result }
|
21
|
+
it "returns the most recent Result for the Test" do
|
22
|
+
expect(latest_result).to be_a(Result)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#add_result" do
|
27
|
+
it "returns a new Result" do
|
28
|
+
test.add_result(:status_id => 1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end # module RTrail
|
34
|
+
|