testasia 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,18 @@
1
+ = testasia
2
+
3
+ Testasia is a command line client for Testopia[http://www.mozilla.org/projects/testopia/] written in ruby.
4
+ Currently its functionality is still limited but will be improved over time.
5
+
6
+ == Commandline features:
7
+ - Create Builds
8
+ - Create Testplans
9
+ - Create Testcases
10
+ - Create Testruns
11
+
12
+ == Todo
13
+
14
+ - Create Environments
15
+ - Create Testcaseruns (add testcases to runs)
16
+ - Print Testplan, Testcase, Testrun and Testcaseruns
17
+ - Delete Testplan, Testcase, Testrun and Testcaseruns
18
+ - Update Testplan, Testcase, Testrun and Testcaseruns
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+
4
+ desc 'Generate documentation.'
5
+ Rake::RDocTask.new(:rdoc) do |rdoc|
6
+ rdoc.rdoc_dir = 'rdoc'
7
+ rdoc.title = 'active_resource_test_hekper'
8
+ rdoc.options << '--line-numbers' << "--main" << "README.rdoc"
9
+ rdoc.rdoc_files.include('README.rdoc')
10
+ rdoc.rdoc_files.include('lib/**/*.rb')
11
+ end
12
+
13
+ begin
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |s|
16
+ s.name = %q{testasia}
17
+ s.summary = %q{A commandline client for Testopia (http://www.mozilla.org/projects/testopia/)}
18
+ s.description = %q{A commandline client for Testopia (http://www.mozilla.org/projects/testopia/)}
19
+
20
+ s.files = FileList['[A-Z]*', 'lib/**/*.rb', 'bin/**/*.rb']
21
+ s.require_path = 'lib'
22
+ #s.test_files = Dir[*['test/**/*_test.rb']]
23
+
24
+ s.has_rdoc = true
25
+ s.extra_rdoc_files = ["README.rdoc"]
26
+ s.rdoc_options = ['--line-numbers', "--main", "README.rdoc"]
27
+
28
+ s.authors = ["Christian Hueller"]
29
+ s.email = %q{chuller@suse.de}
30
+ s.homepage = "http://gitorious.org/testasia"
31
+
32
+ s.platform = Gem::Platform::RUBY
33
+ end
34
+ Jeweler::GemcutterTasks.new
35
+ rescue LoadError
36
+ puts "Jeweler not available. Install it with: gem install jeweler"
37
+ end
38
+
39
+ desc "Clean files generated by rake tasks"
40
+ task :clobber => [:clobber_rdoc]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/testasia.rb ADDED
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'xmlrpc/client'
5
+ require 'lib/product.rb'
6
+ require 'lib/environment.rb'
7
+ require 'lib/testplan.rb'
8
+ require 'lib/testcase.rb'
9
+ require 'lib/testrun.rb'
10
+ require 'lib/build.rb'
11
+
12
+
13
+ opt = OptionParser.new
14
+
15
+ opt.banner = "Usage: #{$0} COMMAND [options]"
16
+ opt.separator("Commands:")
17
+ opt.separator(" create_plan\t\t\t Create a new test plan")
18
+ opt.separator(" create_case\t\t\t Create a new test case")
19
+ opt.separator(" create_run\t\t\t Create a new test run")
20
+ opt.separator(" create_caserun\t\t\t Add a testcase to a run")
21
+ opt.separator(" create_build\t\t\t Add a build to a product")
22
+ opt.separator(" create_environment\t\t\t Add a environment to a product")
23
+ opt.separator(" TESTING\t\t\t TEST the script")
24
+ opt.separator("\n")
25
+ opt.separator("Generic options:")
26
+ opt.on( "-a", "--account=", "Testopia/Bugzilla account" ) do |a|
27
+ $tt_account = a
28
+ end
29
+ opt.on( "-w", "--passwd=", "Testopia/Bugzilla password" ) do |w|
30
+ $tt_password = w
31
+ end
32
+ opt.on( "-u", "--uri=", "Testopia/Bugzilla URI" ) do |u|
33
+ $tt_uri = u
34
+ end
35
+ opt.on( "-p", "--product=", "ID or name of the product" ) do |p|
36
+ $product = p
37
+ end
38
+ opt.on( "-n", "--name=", "ID or name of testplan, testrun, build or environment and summary for a testcase" ) do |n|
39
+ $name = n
40
+ end
41
+ opt.on( "-c", "--check=", "if #{$0}=1, do not create anything if it already exists" ) do |c|
42
+ $check = c
43
+ end
44
+
45
+ opt.separator("\nOptions required for \"create_plan\":")
46
+ opt.on( "-t", "--type=", "type of testplan" ) do |t|
47
+ $type = t
48
+ end
49
+ opt.on( "-d", "--default_product_version=", "The product version of the testplan" ) do |d|
50
+ $default_product_version = d
51
+ end
52
+
53
+ opt.separator("\nOptions required for \"create_case\":")
54
+ opt.on( "-s", "--status=", "status of the testcase" ) do |s|
55
+ $status = s
56
+ end
57
+ opt.on( "-o", "--category=", "Category of the testcase" ) do |c|
58
+ $category = c
59
+ end
60
+ opt.on( "-y", "--priority=", "Priority of the testcase" ) do |y|
61
+ $priority = y
62
+ end
63
+ opt.on( "-l", "--plan=", "plan the testcase gets added" ) do |l|
64
+ $plans = l
65
+ end
66
+
67
+ opt.separator("\nOptions required for \"create_run\":")
68
+ opt.on( "-x", "--plan-id=", "Plan ID the testrun gets added" ) do |l|
69
+ $plan_id = l
70
+ end
71
+ opt.on( "-e", "--environment=", "Environment for the testrun" ) do |e|
72
+ $environment = e
73
+ end
74
+ opt.on( "-b", "--build=", "Build for the testrun" ) do |b|
75
+ $build = b
76
+ end
77
+ opt.on( "-m", "--manager=", "Manager of the testrun" ) do |m|
78
+ $manager = m
79
+ end
80
+
81
+ opt.separator("\nOptions required for \"create_caseruni\":")
82
+ opt.on( "-r", "--run_id=", "id of the testrun testcases get added" ) do |r|
83
+ $run_id = r
84
+ end
85
+ opt.on( "-i", "--case_id=", "id of the testcase to added" ) do |i|
86
+ $case_id = i
87
+ end
88
+ opt.on( "-b", "--build=", "build for the testcaserun" ) do |b|
89
+ $build = b
90
+ end
91
+ opt.on( "-e", "--environment=", "environment for the testrun" ) do |e|
92
+ $environment = e
93
+ end
94
+
95
+ opt.on( "-h", "--help", "Print this message" ) do
96
+ puts opt
97
+ exit
98
+ end
99
+
100
+ begin
101
+ opt.parse!( ARGV )
102
+ rescue OptionParser::InvalidOption
103
+ STDERR.puts $!
104
+ STDERR.puts opt
105
+ exit 1
106
+ end
107
+
108
+ mode = ARGV[0]
109
+ if mode.nil? or !["TESTING", "create_plan", "create_case", "create_run", "create_caserun", "create_build", "create_environment"].include?(mode)
110
+ STDERR.puts opt
111
+ end
112
+
113
+
114
+ # evaluate some options and adjust accordingly
115
+ #
116
+ $summary = $name
117
+ if $check == "0"
118
+ $check = false
119
+ else
120
+ $check = true
121
+ end
122
+
123
+
124
+ # array containing required argumnets per mode
125
+ #
126
+ mode_args = {"create_plan"=>{"product"=>$product, "name"=>$name, "type"=>$type, "default_product_version"=>$default_product_version},
127
+ "create_case"=>{"status"=>$status, "category"=>$category, "priority"=>$priority, "summary"=>$summary, "plans"=>$plans},
128
+ "create_run"=>{"plan_id"=>$plan_id, "environment"=>$environment, "build"=>$build, "manager"=>$manager, "summary"=>$summary},
129
+ "create_caserun"=>{"run_id"=>$run_id, "case_id"=>$case_id, "build"=>$build, "environment"=>$environment},
130
+ "create_build"=>{"product"=>$product, "name"=>$name},
131
+ "create_environment"=>{"product_id"=>$product_id, "name"=>$name}}
132
+ $content = mode_args[mode]
133
+
134
+
135
+ # locally used subroutines
136
+ #
137
+
138
+ def check_options(mode, content)
139
+ missing = Array.new
140
+ content.each do |key, value|
141
+ if value.nil?
142
+ missing = missing.push(key)
143
+ end
144
+ end
145
+ if !missing.empty?
146
+ missing = missing * "\n"
147
+ print "For the mode \"", mode, "\" these options have to be set:\n", missing, "\n"
148
+ exit 1
149
+ end
150
+ end
151
+
152
+
153
+ def tt_login(account, password, uri)
154
+ uri =~ /(.*)(\/.*)/
155
+ host = $1
156
+ path = $2
157
+
158
+ puts "Logging into testopia"
159
+ $server = XMLRPC::Client.new(host, path, nil, nil, nil, account, password, true)
160
+ puts "Testopia version:"
161
+ puts $server.call("Testopia.testopia_version")
162
+ end
163
+
164
+
165
+ # "main"
166
+ #
167
+
168
+ check_options(mode, $content)
169
+ tt_login($tt_account, $tt_password, $tt_uri)
170
+
171
+
172
+
173
+ if mode == "create_build"
174
+ puts "Creating Build"
175
+ b = Build.new
176
+ b.build = $content
177
+ b.check_build = $check
178
+ build = b.create
179
+ puts build.inspect
180
+
181
+
182
+ elsif mode == "create_environment"
183
+ puts "Creating Environment"
184
+ puts " Yet to be implemented "
185
+
186
+
187
+ elsif mode == "create_caserun"
188
+ puts "Create CaseRun"
189
+ puts " Yet to be implemented "
190
+
191
+
192
+ elsif mode == "create_plan"
193
+ puts "Create Testplan"
194
+ tp = Testplan.new($content)
195
+ tp.check = $check
196
+ testplan = tp.write
197
+ puts testplan.inspect
198
+
199
+
200
+ elsif mode == "create_case"
201
+ puts "Create Testcase"
202
+ tc = Testcase.new($content)
203
+ tc.check = $check
204
+ testcase = tc.write
205
+ puts testplan
206
+
207
+
208
+ elsif mode == "create_run"
209
+ puts "Create Testrun"
210
+ tr = Testrun.new($content)
211
+ tr.check = $check
212
+ testrun = tr.write
213
+ puts testrun
214
+
215
+
216
+ elsif mode == "TESTING"
217
+ puts "RUNNING TESTS"
218
+
219
+ dada = Testcase.new
220
+ dada.testcase = {"summary"=>"kdesd", "plan_id"=>2943}
221
+ if dada.exists?
222
+ puts true
223
+ else
224
+ puts false
225
+ end
226
+ end
data/lib/build.rb ADDED
@@ -0,0 +1,35 @@
1
+ class Build
2
+ def initialize(build=nil)
3
+ @build = build
4
+ @check_build = false
5
+ end
6
+
7
+ attr_reader :build, :check_build
8
+ attr_writer :build, :check_build
9
+
10
+ def check
11
+ puts "checking if build already exists"
12
+ begin
13
+ @build = $server.call("Build.check_build", @build["name"], @build["product"])
14
+ rescue
15
+ return @build
16
+ end
17
+ end
18
+
19
+ def create
20
+ if @build["name"].nil?
21
+ puts "Build name not set"
22
+ return false
23
+ elsif @build["product"].nil?
24
+ puts "Build product not set"
25
+ return false
26
+ end
27
+ puts @check_build
28
+ if @check_build == true
29
+ self.check
30
+ end
31
+ @build = $server.call("Build.create", @build)
32
+ return @build
33
+ end
34
+ end
35
+
@@ -0,0 +1,18 @@
1
+ class Environment
2
+ def initialize(environment=nil)
3
+ @environment = environment
4
+ end
5
+
6
+ attr_writer :environment
7
+ attr_reader :environment
8
+
9
+ def get_id
10
+ @environments = $server.call("Environment.list", environment)
11
+ #As testopia returns anything with the environment string in it we need to match exactly
12
+ @environments.each do |i|
13
+ if i.has_value?(environment_name)
14
+ return i["environment_id"]
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/product.rb ADDED
@@ -0,0 +1,31 @@
1
+ class Product
2
+ def initialize(product)
3
+ @product = product
4
+ end
5
+
6
+
7
+ def get_builds(active)
8
+ @builds = $server.call("Product.get_builds", @product, active)
9
+ return @builds
10
+ end
11
+
12
+
13
+ def get_environments
14
+ @environments = $server.call("Product.get_environments", @product)
15
+ return @environments
16
+ end
17
+
18
+
19
+ def get_categories
20
+ @categories = $server.call("Product.get_categories", @product)
21
+ return @categories
22
+ end
23
+
24
+
25
+ def get_components
26
+ @components = $server.call("Product.get_components", @product)
27
+ return @product
28
+ end
29
+
30
+ end
31
+
data/lib/testcase.rb ADDED
@@ -0,0 +1,205 @@
1
+ # testcase hash layout:
2
+ #
3
+ # +-------------------+----------------+-----------+------------------------+
4
+ # | Field | Type | Null | Description |
5
+ # +-------------------+----------------+-----------+------------------------+
6
+ # | status | Integer/String | Required | ID or Name of status |
7
+ # | category* | Integer/Hash | Required | ID or hash |
8
+ # | priority | Integer/String | Required | ID or Name of Priority |
9
+ # | summary | String | Required | |
10
+ # | plans | Array/Str/Int | Required | ID or List of plan_ids |
11
+ # | default_tester | Integer/String | Optional | ID or Login of tester |
12
+ # | estimated_time | String | Optional | HH:MM:SS Format |
13
+ # | isautomated | Boolean | Optional | Defaults to False (0) |
14
+ # | sortkey | Integer | Optional | |
15
+ # | script | String | Optional | |
16
+ # | arguments | String | Optional | |
17
+ # | requirement | String | Optional | |
18
+ # | alias | String | Optional | Must be unique |
19
+ # | action | String | Optional | |
20
+ # | effect | String | Optional | ExpectedResult |
21
+ # | setup | String | Optional | |
22
+ # | breakdown | String | Optional | |
23
+ # | dependson | Array/String | Optional | String Comma separated |
24
+ # | blocks | Array/String | Optional | String Comma separated |
25
+ # | tags | Array/String | Optional | String Comma separated |
26
+ # | bugs | Array/String | Optional | String Comma separated |
27
+ # | components+ | Array/Hash/Str | Optional | String Comma separated |
28
+ # +-------------------+----------------+-----------+------------------------+
29
+ # * category hash = {category => 'string', product => 'string'}
30
+ # + components can be an array of IDs, a comma separated string of IDs,
31
+ # an array of Hashes, or a single hash.
32
+ # component hash = {component => 'string', product => 'string'}
33
+ # +--------------------------------------------------------+
34
+ # | Case Search Parameters |
35
+ # +--------------------------------------------------------+
36
+ # | Key | Valid Values |
37
+ # | andor | 1: Author AND tester, 0: OR |
38
+ # | author | A bugzilla login (email address) |
39
+ # | author_type | (select from email_variants) |
40
+ # | case_id | comma separated integers |
41
+ # | case_status | String: Status |
42
+ # | case_status_id | Integer: Status |
43
+ # | category | String: Category Name |
44
+ # | category_id | Integer |
45
+ # | component | String: Component Name |
46
+ # | default_tester | A bugzilla login (email address) |
47
+ # | default_tester_type | (select from email_variants) |
48
+ # | isautomated | 1: true 0: false |
49
+ # | plan_id | comma separated integers |
50
+ # | priority | String: Priority |
51
+ # | priority_id | Integer |
52
+ # | product | String: Product Name |
53
+ # | product_id | Integer |
54
+ # | requirement | String: Requirement |
55
+ # | requirement_type | (select from query_variants) |
56
+ # | run_id | comma separated integers |
57
+ # | script | String |
58
+ # | script_type | (select from query_variants) |
59
+ # | summary | String |
60
+ # | summary_type | (select from query_variants) |
61
+ # | tags | String |
62
+ # | tags_type | (select from tag_variants) |
63
+ # | tcaction | String |
64
+ # | tcaction_type | (select from query_variants) |
65
+ # | tceffect | String |
66
+ # | tceffect_type | (select from query_variants) |
67
+ # +--------------------------------------------------------+
68
+ #
69
+ # +---------------------------------------------------+
70
+ # | Paging and Sorting |
71
+ # +---------------------------------------------------+
72
+ # | Key | Description |
73
+ # | dir | "ASC" or "DESC" |
74
+ # | order | field to sort by |
75
+ # +---------------------------------------------------+
76
+ # | page_size | integer: how many per page |
77
+ # | page | integer: page number |
78
+ # | +++++++ OR +++++++ |
79
+ # | start | integer: Start with which record |
80
+ # | limit | integer: limit to how many |
81
+ # +---------------------------------------------------+
82
+ # | viewall | 1: returns all records |
83
+ # +---------------------------------------------------+
84
+ # * The default is to only return 25 records at a time
85
+ #
86
+ # +----------------------------------------------------+
87
+ # | query_variants |
88
+ # +----------------+-----------------------------------+
89
+ # | Key | Description |
90
+ # | allwordssubstr | contains all of the words/strings |
91
+ # | anywordssubstr | contains any of the words/strings |
92
+ # | substring | contains the string |
93
+ # | casesubstring | contains the string (exact case) |
94
+ # | allwords | contains all of the words |
95
+ # | anywords | contains any of the words |
96
+ # | regexp | matches the regexp |
97
+ # | notregexp | doesn't match the regexp |
98
+ # +----------------+-----------------------------------+
99
+ #
100
+ # +-------------------------------------+
101
+ # | email_variants |
102
+ # +--------------+----------------------+
103
+ # | Key | Description |
104
+ # | substring | contains |
105
+ # | exact | is |
106
+ # | regexp | matches regexp |
107
+ # | notregexp | doesn't match regexp |
108
+ # +--------------+----------------------+
109
+ #
110
+ # +----------------------------------------------------+
111
+ # | tag_variants |
112
+ # +----------------+-----------------------------------+
113
+ # | Key | Description |
114
+ # | anyexact | is tagged with |
115
+ # | allwordssubstr | contains all of the words/strings |
116
+ # | anywordssubstr | contains any of the words/strings |
117
+ # | substring | contains the string |
118
+ # | casesubstring | contains the string (exact case) |
119
+ # | regexp | matches the regexp |
120
+ # | notregexp | doesn't match the regexp |
121
+ # | allwords | contains all of the words |
122
+ # | anywords | contains any of the words |
123
+ # | nowords | contains none of the words |
124
+ # +----------------------------------------------------+
125
+ #
126
+
127
+
128
+ class Testcase
129
+ def initialize(testcase=nil)
130
+ @testcase = testcase
131
+ @check = true
132
+ end
133
+
134
+ attr_reader :testcase, :check
135
+ attr_writer :testcase, :check
136
+
137
+ def write
138
+ if @testcase["summary"].nil?
139
+ puts "Testcase summary needs to have some value"
140
+ return false
141
+ elsif @testcase["category"].nil?
142
+ puts "Testcase category must be set"
143
+ return false
144
+ elsif @testcase["plans"].nil?
145
+ puts "No testplans defined to add testcase"
146
+ return false
147
+ end
148
+ if @testcase["priority"].nil?
149
+ puts "Testcase priority not set. Using [P5 - None]"
150
+ @testcase["priority"] = "P5 - None"
151
+ end
152
+ if @testcase["status"].nil?
153
+ puts "Testcase status not set. Using [PROPOSED]"
154
+ @testcase["status"] = "PROPOSED"
155
+ end
156
+
157
+ if @check
158
+ if self.exists?
159
+ puts "Testcase already existing - aborting"
160
+ return false
161
+ else
162
+ @testcase = $server.call("TestCase.create", @testcase)
163
+ return @testcase
164
+ end
165
+ else
166
+ @testcase = $server.call("TestCase.create", @testcase)
167
+ return @testcase
168
+ end
169
+ end
170
+
171
+
172
+ def read(id)
173
+ @testcase = $server.call("TestCase.get", id)
174
+ return @testcase
175
+ end
176
+
177
+
178
+ def print
179
+ puts @testcase.inspect
180
+ end
181
+
182
+
183
+ def find
184
+ puts @testcase.inspect
185
+ @result = $server.call("TestCase.list", @testcase)
186
+ return @result
187
+ end
188
+
189
+
190
+ def exists?
191
+ @result = self.find
192
+ if @result.empty?
193
+ return false
194
+ else
195
+ return true
196
+ end
197
+ end
198
+
199
+
200
+ def get_plans(case_id)
201
+ @result = $server.call("TestCase.list", case_id)
202
+ return @result
203
+ end
204
+
205
+ end
data/lib/testplan.rb ADDED
@@ -0,0 +1,113 @@
1
+ # testplan hash layout
2
+ #
3
+ # +-------------------------+----------------+-----------+------------------------------------+
4
+ # | Field | Type | Null | Description |
5
+ # +-------------------------+----------------+-----------+------------------------------------+
6
+ # | product | Integer/String | Required | ID or Name of product |
7
+ # | name | String | Required | |
8
+ # | type | Integer/String | Required | ID or name of plan type |
9
+ # | default_product_version | String | Required | |
10
+ # | isactive | Boolean | Optional | 0: Archived 1: Active (Default 1) |
11
+ # +-------------------------+----------------+-----------+------------------------------------+
12
+ #
13
+ #
14
+ # +--------------------------------------------------------+
15
+ # | Plan Search Parameters |
16
+ # +--------------------------------------------------------+
17
+ # | Key | Valid Values |
18
+ # | author | A bugzilla login (email address) |
19
+ # | author_type | (select from email_variants) |
20
+ # | plan_id | comma separated integers |
21
+ # | plan_text | String |
22
+ # | plan_text_type | (select from query_variants) |
23
+ # | plan_type | String: Product Name |
24
+ # | product | String: Product Name |
25
+ # | product_id | Integer |
26
+ # | tags | String |
27
+ # | tags_type | (select from tag_variants) |
28
+ # | type_id | Integer |
29
+ # | version | String: Product version |
30
+ # +--------------------------------------------------------+
31
+ #
32
+
33
+
34
+ class Testplan
35
+ def initialize(testplan=nil)
36
+ @testplan = testplan
37
+ @check = true
38
+ end
39
+
40
+ attr_reader :testplan, :check
41
+ attr_writer :testplan, :check
42
+
43
+
44
+ def write
45
+ if @testplan["product"].nil?
46
+ puts "No product ID set while attempting to create Testplan"
47
+ return false
48
+ elsif @testplan["name"].nil?
49
+ puts "No name is set while attempting to create a testplan"
50
+ return false
51
+ elsif @testplan["default_product_version"].nil?
52
+ puts "No product_version is set while attempting to create a testplan"
53
+ return false
54
+ end
55
+
56
+ if @testplan["isactive"].nil?
57
+ puts "Activity state of testplan not set while creating testplan. Using [isactive = 1]"
58
+ @testplan["isactive"] = 1
59
+ end
60
+ if @testplan["type"].nil?
61
+ puts "Testplan type not set while creating Testplan. Using [Function]"
62
+ @testplan["type"] = "Function"
63
+ end
64
+
65
+ if @check
66
+ if self.exists?
67
+ puts "Testplan already existing - aborting"
68
+ return false
69
+ else
70
+ @testplan = $server.call("TestPlan.create", @testplan)
71
+ return @testplan
72
+ end
73
+ else
74
+ @testplan = $server.call("TestPlan.create", @testplan)
75
+ return @testplan
76
+ end
77
+ end
78
+
79
+
80
+ def read(id)
81
+ @testplan = $server.call("TestPlan.get", id)
82
+ return @testplan
83
+ end
84
+
85
+
86
+ def print
87
+ puts @testplan.inspect
88
+ end
89
+
90
+
91
+ def find
92
+ @query = {"name"=>@testplan["name"], "product_id"=>@testplan["product"]}
93
+ @result = $server.call("TestPlan.list", @query)
94
+ return @result
95
+ end
96
+
97
+
98
+ def exists?
99
+ @result = self.find
100
+ if @result.empty?
101
+ return false
102
+ else
103
+ return true
104
+ end
105
+ end
106
+
107
+
108
+ def get_product_id(plan_id)
109
+ @product = $server.call("TestPlan.get_product", plan_id)
110
+ return @product["id"]
111
+ end
112
+
113
+ end
data/lib/testrun.rb ADDED
@@ -0,0 +1,196 @@
1
+ # testrun hash layout
2
+ #
3
+ # matching the fields of the test run to be created.
4
+ # +-------------------+----------------+-----------+------------------------------------+
5
+ # | Field | Type | Null | Description |
6
+ # +-------------------+----------------+-----------+------------------------------------+
7
+ # | plan_id | Integer | Required | ID of test plan |
8
+ # | environment | Integer/String | Required | ID or Name of Environment |
9
+ # | build | Integer/String | Required | ID or Name of Build |
10
+ # | manager | Integer/String | Required | ID or Login of run manager |
11
+ # | summary | String | Required | |
12
+ # | product_version | String | Optional | Defaults to plan's version |
13
+ # | plan_text_version | Integer | Optional | |
14
+ # | target_completion | Integer | Optional | Targetted Completion percentage |
15
+ # | target_pass | Integer | Optional | Targetted Pass percentage |
16
+ # | notes | String | Optional | |
17
+ # | status | Integer | Optional | 0:STOPPED 1: RUNNING (default 1) |
18
+ # | cases | Array/String | Optional | list of case ids to add to the run |
19
+ # +-------------------+----------------+-----------+------------------------------------+
20
+ #
21
+ #
22
+ # +--------------------------------------------------------+
23
+ # | Run Search Parameters |
24
+ # +--------------------------------------------------------+
25
+ # | Key | Valid Values |
26
+ # | build | String: Product Name |
27
+ # | build_id | Integer |
28
+ # | environment | String: Product Name |
29
+ # | environment_id | Integer |
30
+ # | manager | A bugzilla login (email address) |
31
+ # | manager_type | (select from email_variants) |
32
+ # | milestone | String |
33
+ # | notes | String |
34
+ # | notes_type | (select from query_variants) |
35
+ # | plan_id | comma separated integers |
36
+ # | product | String: Product Name |
37
+ # | product_id | Integer |
38
+ # | run_id | comma separated integers |
39
+ # | run_status | 1: RUNNING 0: STOPPED |
40
+ # | summary | String |
41
+ # | summary_type | (select from query_variants) |
42
+ # | tags | String |
43
+ # | tags_type | (select from tag_variants) |
44
+ # | type_id | Integer |
45
+ # | version | String: Product version |
46
+ # +--------------------------------------------------------+
47
+ #
48
+ # +--------------------------------------------------------+
49
+ # | Paging and Sorting |
50
+ # +--------------------------------------------------------+
51
+ # | Key | Description |
52
+ # | dir | "ASC" or "DESC" |
53
+ # | order | field to sort by |
54
+ # +--------------------------------------------------------+
55
+ # | page_size | integer: how many per page |
56
+ # | page | integer: page number |
57
+ # | +++++++ OR +++++++ |
58
+ # | start | integer: Start with which record |
59
+ # | limit | integer: limit to how many |
60
+ # +--------------------------------------------------------+
61
+ # | viewall | 1: returns all records 0: first 25 |
62
+ # +--------------------------------------------------------+
63
+ # * The default is to only return 25 records at a time
64
+ #
65
+ # +----------------------------------------------------+
66
+ # | query_variants |
67
+ # +----------------+-----------------------------------+
68
+ # | Key | Description |
69
+ # | allwordssubstr | contains all of the words/strings |
70
+ # | anywordssubstr | contains any of the words/strings |
71
+ # | substring | contains the string |
72
+ # | casesubstring | contains the string (exact case) |
73
+ # | allwords | contains all of the words |
74
+ # | anywords | contains any of the words |
75
+ # | regexp | matches the regexp |
76
+ # | notregexp | doesn't match the regexp |
77
+ # +----------------+-----------------------------------+
78
+ #
79
+ # +-------------------------------------+
80
+ # | email_variants |
81
+ # +--------------+----------------------+
82
+ # | Key | Description |
83
+ # | substring | contains |
84
+ # | exact | is |
85
+ # | regexp | matches regexp |
86
+ # | notregexp | doesn't match regexp |
87
+ # +--------------+----------------------+
88
+ #
89
+ # +----------------------------------------------------+
90
+ # | tag_variants |
91
+ # +----------------+-----------------------------------+
92
+ # | Key | Description |
93
+ # | anyexact | is tagged with |
94
+ # | allwordssubstr | contains all of the words/strings |
95
+ # | anywordssubstr | contains any of the words/strings |
96
+ # | substring | contains the string |
97
+ # | casesubstring | contains the string (exact case) |
98
+ # | regexp | matches the regexp |
99
+ # | notregexp | doesn't match the regexp |
100
+ # | allwords | contains all of the words |
101
+ # | anywords | contains any of the words |
102
+ # | nowords | contains none of the words |
103
+ # +----------------------------------------------------+
104
+ #
105
+ #
106
+
107
+
108
+
109
+ class Testrun
110
+ def initialize(testrun=nil)
111
+ @testrun = testrun
112
+ @check = true
113
+ end
114
+
115
+ attr_reader :testrun, :check
116
+ attr_writer :testrun, :check
117
+
118
+ def write
119
+ if @testrun["plan_id"].nil?
120
+ puts "Testrun plan_id not set"
121
+ return false
122
+ elsif @testrun["environment"].nil?
123
+ puts "Testrun environment not set"
124
+ return false
125
+ elsif @testrun["build"].nil?
126
+ puts "Testrun build not set"
127
+ return false
128
+ elsif @testrun["summary"].nil?
129
+ puts "Testrun summary not set"
130
+ return false
131
+ end
132
+ if @testrun["manager"].nil?
133
+ puts "Testrun manager not set. Using ",$tt_account," as manager"
134
+ @testrun["manager"] = $tt_account
135
+ end
136
+
137
+ if @check
138
+ if self.exists?
139
+ puts "Testrun already existing - aborting"
140
+ return false
141
+ else
142
+ @testrun = $server.call("TestRun.create", @testrun)
143
+ return @testrun
144
+ end
145
+ end
146
+ @testrun = $server.call("TestRun.create", @testrun)
147
+ return @testrun
148
+ end
149
+
150
+
151
+ def read(id)
152
+ @testrun = $server.call("TestRun.get", id)
153
+ return @testrun
154
+ end
155
+
156
+
157
+ def print
158
+ puts @tr
159
+ end
160
+
161
+
162
+ def find
163
+ puts @testcase.inspect
164
+ @result = $server.call("TestRun.list", @testrun)
165
+ return @result
166
+ end
167
+
168
+
169
+ def exists?
170
+ @result = self.find
171
+ if @result.empty?
172
+ return false
173
+ else
174
+ return true
175
+ end
176
+ end
177
+
178
+
179
+ def add(case_ids)
180
+ @case_ids = case_ids
181
+
182
+ if @testrun["run_id"].nil
183
+ puts "No test run_id set"
184
+ return false
185
+ else
186
+ @result = $server.call("TestRun.add_cases", @case_ids, @testrun["run_id"])
187
+ if @result.empty?
188
+ return true
189
+ else
190
+ return false
191
+ end
192
+ end
193
+
194
+ end
195
+
196
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: testasia
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Christian Hueller
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-06-15 00:00:00 +02:00
19
+ default_executable: testasia.rb
20
+ dependencies: []
21
+
22
+ description: A commandline client for Testopia (http://www.mozilla.org/projects/testopia/)
23
+ email: chuller@suse.de
24
+ executables:
25
+ - testasia.rb
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.rdoc
30
+ files:
31
+ - README.rdoc
32
+ - Rakefile
33
+ - VERSION
34
+ - bin/testasia.rb
35
+ - lib/build.rb
36
+ - lib/environment.rb
37
+ - lib/product.rb
38
+ - lib/testcase.rb
39
+ - lib/testplan.rb
40
+ - lib/testrun.rb
41
+ has_rdoc: true
42
+ homepage: http://gitorious.org/testasia
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --line-numbers
48
+ - --main
49
+ - README.rdoc
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.7
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: A commandline client for Testopia (http://www.mozilla.org/projects/testopia/)
77
+ test_files: []
78
+