grntest 1.0.2 → 1.0.3
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.
- data/doc/text/news.md +11 -1
- data/lib/grntest/base-result.rb +32 -0
- data/lib/grntest/error.rb +39 -0
- data/lib/grntest/execution-context.rb +89 -0
- data/lib/grntest/executors.rb +19 -0
- data/lib/grntest/executors/base-executor.rb +332 -0
- data/lib/grntest/executors/http-executor.rb +60 -0
- data/lib/grntest/executors/standard-io-executor.rb +71 -0
- data/lib/grntest/reporters.rb +37 -0
- data/lib/grntest/reporters/base-reporter.rb +375 -0
- data/lib/grntest/reporters/inplace-reporter.rb +208 -0
- data/lib/grntest/reporters/mark-reporter.rb +112 -0
- data/lib/grntest/reporters/stream-reporter.rb +86 -0
- data/lib/grntest/response-parser.rb +64 -0
- data/lib/grntest/test-runner.rb +511 -0
- data/lib/grntest/test-suites-runner.rb +141 -0
- data/lib/grntest/tester.rb +2 -1975
- data/lib/grntest/version.rb +1 -1
- data/lib/grntest/worker.rb +164 -0
- data/test/executors/test-base-executor.rb +42 -0
- data/test/executors/test-standard-io-executor.rb +61 -0
- metadata +22 -10
- data/test/test-executor.rb +0 -207
data/lib/grntest/version.rb
CHANGED
@@ -0,0 +1,164 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2012-2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
require "grntest/base-result"
|
19
|
+
require "grntest/test-runner"
|
20
|
+
|
21
|
+
module Grntest
|
22
|
+
class WorkerResult < BaseResult
|
23
|
+
attr_reader :n_tests, :n_passed_tests, :n_leaked_tests
|
24
|
+
attr_reader :n_omitted_tests, :n_not_checked_tests
|
25
|
+
attr_reader :failed_tests
|
26
|
+
def initialize
|
27
|
+
super
|
28
|
+
@n_tests = 0
|
29
|
+
@n_passed_tests = 0
|
30
|
+
@n_leaked_tests = 0
|
31
|
+
@n_omitted_tests = 0
|
32
|
+
@n_not_checked_tests = 0
|
33
|
+
@failed_tests = []
|
34
|
+
end
|
35
|
+
|
36
|
+
def n_failed_tests
|
37
|
+
@failed_tests.size
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_test_finish
|
41
|
+
@n_tests += 1
|
42
|
+
end
|
43
|
+
|
44
|
+
def on_test_success
|
45
|
+
@n_passed_tests += 1
|
46
|
+
end
|
47
|
+
|
48
|
+
def on_test_failure(name)
|
49
|
+
@failed_tests << name
|
50
|
+
end
|
51
|
+
|
52
|
+
def on_test_leak(name)
|
53
|
+
@n_leaked_tests += 1
|
54
|
+
end
|
55
|
+
|
56
|
+
def on_test_omission
|
57
|
+
@n_omitted_tests += 1
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_test_no_check
|
61
|
+
@n_not_checked_tests += 1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Worker
|
66
|
+
attr_reader :id, :tester, :test_suites_rusult, :reporter
|
67
|
+
attr_reader :suite_name, :test_script_path, :test_name, :status, :result
|
68
|
+
def initialize(id, tester, test_suites_result, reporter)
|
69
|
+
@id = id
|
70
|
+
@tester = tester
|
71
|
+
@test_suites_result = test_suites_result
|
72
|
+
@reporter = reporter
|
73
|
+
@suite_name = nil
|
74
|
+
@test_script_path = nil
|
75
|
+
@test_name = nil
|
76
|
+
@interruptted = false
|
77
|
+
@status = "not running"
|
78
|
+
@result = WorkerResult.new
|
79
|
+
end
|
80
|
+
|
81
|
+
def interrupt
|
82
|
+
@interruptted = true
|
83
|
+
end
|
84
|
+
|
85
|
+
def interruptted?
|
86
|
+
@interruptted
|
87
|
+
end
|
88
|
+
|
89
|
+
def run(queue)
|
90
|
+
succeeded = true
|
91
|
+
|
92
|
+
@result.measure do
|
93
|
+
@reporter.on_worker_start(self)
|
94
|
+
catch do |tag|
|
95
|
+
loop do
|
96
|
+
suite_name, test_script_path, test_name = queue.pop
|
97
|
+
break if test_script_path.nil?
|
98
|
+
|
99
|
+
unless @suite_name == suite_name
|
100
|
+
@reporter.on_suite_finish(self) if @suite_name
|
101
|
+
@suite_name = suite_name
|
102
|
+
@reporter.on_suite_start(self)
|
103
|
+
end
|
104
|
+
@test_script_path = test_script_path
|
105
|
+
@test_name = test_name
|
106
|
+
runner = TestRunner.new(@tester, self)
|
107
|
+
succeeded = false unless runner.run
|
108
|
+
|
109
|
+
break if interruptted?
|
110
|
+
end
|
111
|
+
@status = "finished"
|
112
|
+
@reporter.on_suite_finish(@suite_name) if @suite_name
|
113
|
+
@suite_name = nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
@reporter.on_worker_finish(self)
|
117
|
+
|
118
|
+
succeeded
|
119
|
+
end
|
120
|
+
|
121
|
+
def on_test_start
|
122
|
+
@status = "running"
|
123
|
+
@test_result = nil
|
124
|
+
@reporter.on_test_start(self)
|
125
|
+
end
|
126
|
+
|
127
|
+
def on_test_success(result)
|
128
|
+
@status = "passed"
|
129
|
+
@result.on_test_success
|
130
|
+
@reporter.on_test_success(self, result)
|
131
|
+
end
|
132
|
+
|
133
|
+
def on_test_failure(result)
|
134
|
+
@status = "failed"
|
135
|
+
@result.on_test_failure(test_name)
|
136
|
+
@reporter.on_test_failure(self, result)
|
137
|
+
end
|
138
|
+
|
139
|
+
def on_test_leak(result)
|
140
|
+
@status = "leaked(#{result.n_leaked_objects})"
|
141
|
+
@result.on_test_leak(test_name)
|
142
|
+
@reporter.on_test_leak(self, result)
|
143
|
+
end
|
144
|
+
|
145
|
+
def on_test_omission(result)
|
146
|
+
@status = "omitted"
|
147
|
+
@result.on_test_omission
|
148
|
+
@reporter.on_test_omission(self, result)
|
149
|
+
end
|
150
|
+
|
151
|
+
def on_test_no_check(result)
|
152
|
+
@status = "not checked"
|
153
|
+
@result.on_test_no_check
|
154
|
+
@reporter.on_test_no_check(self, result)
|
155
|
+
end
|
156
|
+
|
157
|
+
def on_test_finish(result)
|
158
|
+
@result.on_test_finish
|
159
|
+
@reporter.on_test_finish(self, result)
|
160
|
+
@test_script_path = nil
|
161
|
+
@test_name = nil
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require "grntest/executors/base-executor"
|
17
|
+
|
18
|
+
class TestBaseExecutor < Test::Unit::TestCase
|
19
|
+
def setup
|
20
|
+
@executor = Grntest::Executors::BaseExecutor.new
|
21
|
+
@context = @executor.context
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestErrorLog < self
|
25
|
+
data("emergency" => "E",
|
26
|
+
"alert" => "A",
|
27
|
+
"critical" => "C",
|
28
|
+
"error" => "e",
|
29
|
+
"warning" => "w")
|
30
|
+
def test_important_log_level(level)
|
31
|
+
assert_true(@executor.send(:important_log_level?, level))
|
32
|
+
end
|
33
|
+
|
34
|
+
data("notice" => "n",
|
35
|
+
"info" => "i",
|
36
|
+
"debug" => "d",
|
37
|
+
"dump" => "-")
|
38
|
+
def test_not_important_log_level(level)
|
39
|
+
assert_false(@executor.send(:important_log_level?, level))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Copyright (C) 2012-2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require "stringio"
|
17
|
+
require "tempfile"
|
18
|
+
require "grntest/executors/standard-io-executor"
|
19
|
+
|
20
|
+
class TestStandardIOExecutor < Test::Unit::TestCase
|
21
|
+
def setup
|
22
|
+
input = StringIO.new
|
23
|
+
output = StringIO.new
|
24
|
+
@executor = Grntest::Executors::StandardIOExecutor.new(input, output)
|
25
|
+
@context = @executor.context
|
26
|
+
@script = Tempfile.new("test-executor")
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def execute(command)
|
31
|
+
@script.puts(command)
|
32
|
+
@script.close
|
33
|
+
@executor.execute(Pathname(@script.path))
|
34
|
+
end
|
35
|
+
|
36
|
+
class TestComment < self
|
37
|
+
def test_disable_logging
|
38
|
+
assert_predicate(@context, :logging?)
|
39
|
+
execute("\#@disable-logging")
|
40
|
+
assert_not_predicate(@context, :logging?)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_enable_logging
|
44
|
+
@context.logging = false
|
45
|
+
assert_not_predicate(@context, :logging?)
|
46
|
+
execute("\#@enable-logging")
|
47
|
+
assert_predicate(@context, :logging?)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_suggest_create_dataset
|
51
|
+
mock(@executor).execute_suggest_create_dataset("shop")
|
52
|
+
execute("\#@suggest-create-dataset shop")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_enable_ignore_feature_on_error
|
56
|
+
assert_not_equal(:omit, @context.on_error)
|
57
|
+
execute("\#@on-error omit")
|
58
|
+
assert_equal(:omit, @context.on_error)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grntest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-08-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
@@ -170,12 +170,29 @@ files:
|
|
170
170
|
- Gemfile
|
171
171
|
- grntest.gemspec
|
172
172
|
- .yardopts
|
173
|
+
- lib/grntest/test-runner.rb
|
173
174
|
- lib/grntest/tester.rb
|
175
|
+
- lib/grntest/worker.rb
|
176
|
+
- lib/grntest/response-parser.rb
|
177
|
+
- lib/grntest/error.rb
|
178
|
+
- lib/grntest/base-result.rb
|
174
179
|
- lib/grntest/version.rb
|
180
|
+
- lib/grntest/test-suites-runner.rb
|
181
|
+
- lib/grntest/executors/http-executor.rb
|
182
|
+
- lib/grntest/executors/base-executor.rb
|
183
|
+
- lib/grntest/executors/standard-io-executor.rb
|
184
|
+
- lib/grntest/executors.rb
|
185
|
+
- lib/grntest/execution-context.rb
|
186
|
+
- lib/grntest/reporters.rb
|
187
|
+
- lib/grntest/reporters/inplace-reporter.rb
|
188
|
+
- lib/grntest/reporters/stream-reporter.rb
|
189
|
+
- lib/grntest/reporters/base-reporter.rb
|
190
|
+
- lib/grntest/reporters/mark-reporter.rb
|
175
191
|
- doc/text/news.md
|
176
192
|
- doc/text/gpl-3.0.txt
|
177
193
|
- test/run-test.rb
|
178
|
-
- test/test-executor.rb
|
194
|
+
- test/executors/test-base-executor.rb
|
195
|
+
- test/executors/test-standard-io-executor.rb
|
179
196
|
- bin/grntest
|
180
197
|
homepage: https://github.com/groonga/grntest
|
181
198
|
licenses:
|
@@ -190,18 +207,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
190
207
|
- - ! '>='
|
191
208
|
- !ruby/object:Gem::Version
|
192
209
|
version: '0'
|
193
|
-
segments:
|
194
|
-
- 0
|
195
|
-
hash: -173336567552475669
|
196
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
211
|
none: false
|
198
212
|
requirements:
|
199
213
|
- - ! '>='
|
200
214
|
- !ruby/object:Gem::Version
|
201
215
|
version: '0'
|
202
|
-
segments:
|
203
|
-
- 0
|
204
|
-
hash: -173336567552475669
|
205
216
|
requirements: []
|
206
217
|
rubyforge_project:
|
207
218
|
rubygems_version: 1.8.23
|
@@ -211,5 +222,6 @@ summary: Grntest is a testing framework for groonga. You can write a test for gr
|
|
211
222
|
by writing groonga commands and expected result.
|
212
223
|
test_files:
|
213
224
|
- test/run-test.rb
|
214
|
-
- test/test-executor.rb
|
225
|
+
- test/executors/test-base-executor.rb
|
226
|
+
- test/executors/test-standard-io-executor.rb
|
215
227
|
has_rdoc:
|
data/test/test-executor.rb
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
# Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
|
2
|
-
#
|
3
|
-
# This program is free software: you can redistribute it and/or modify
|
4
|
-
# it under the terms of the GNU General Public License as published by
|
5
|
-
# the Free Software Foundation, either version 3 of the License, or
|
6
|
-
# (at your option) any later version.
|
7
|
-
#
|
8
|
-
# This program is distributed in the hope that it will be useful,
|
9
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
-
# GNU General Public License for more details.
|
12
|
-
#
|
13
|
-
# You should have received a copy of the GNU General Public License
|
14
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
-
|
16
|
-
require "stringio"
|
17
|
-
require "cgi/util"
|
18
|
-
require "grntest/tester"
|
19
|
-
|
20
|
-
class TestExecutor < Test::Unit::TestCase
|
21
|
-
def setup
|
22
|
-
input = StringIO.new
|
23
|
-
output = StringIO.new
|
24
|
-
@executor = Grntest::Tester::StandardIOExecutor.new(input, output)
|
25
|
-
@context = @executor.context
|
26
|
-
@script = Tempfile.new("test-executor")
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
def execute(command)
|
31
|
-
@script.puts(command)
|
32
|
-
@script.close
|
33
|
-
@executor.execute(Pathname(@script.path))
|
34
|
-
end
|
35
|
-
|
36
|
-
class TestComment < self
|
37
|
-
def test_disable_logging
|
38
|
-
assert_predicate(@context, :logging?)
|
39
|
-
execute("\#@disable-logging")
|
40
|
-
assert_not_predicate(@context, :logging?)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_enable_logging
|
44
|
-
@context.logging = false
|
45
|
-
assert_not_predicate(@context, :logging?)
|
46
|
-
execute("\#@enable-logging")
|
47
|
-
assert_predicate(@context, :logging?)
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_suggest_create_dataset
|
51
|
-
mock(@executor).execute_suggest_create_dataset("shop")
|
52
|
-
execute("\#@suggest-create-dataset shop")
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_enable_ignore_feature_on_error
|
56
|
-
assert_not_equal(:omit, @context.on_error)
|
57
|
-
execute("\#@on-error omit")
|
58
|
-
assert_equal(:omit, @context.on_error)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class TestCommandFormatConveter < self
|
63
|
-
def test_without_argument_name
|
64
|
-
command = "table_create Site TABLE_HASH_KEY ShortText"
|
65
|
-
arguments = {
|
66
|
-
"name" => "Site",
|
67
|
-
"flags" => "TABLE_HASH_KEY",
|
68
|
-
"key_type" => "ShortText",
|
69
|
-
}
|
70
|
-
actual_url = convert(command)
|
71
|
-
expected_url = build_url("table_create", arguments)
|
72
|
-
|
73
|
-
assert_equal(expected_url, actual_url)
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_with_argument_name
|
77
|
-
command = "select --table Sites"
|
78
|
-
actual_url = convert(command)
|
79
|
-
expected_url = build_url("select", "table" => "Sites")
|
80
|
-
|
81
|
-
assert_equal(expected_url, actual_url)
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_non_named_argument_after_named_arguement
|
85
|
-
command = "table_create --flags TABLE_HASH_KEY --key_type ShortText Site"
|
86
|
-
arguments = {
|
87
|
-
"flags" => "TABLE_HASH_KEY",
|
88
|
-
"key_type" => "ShortText",
|
89
|
-
"name" => "Site",
|
90
|
-
}
|
91
|
-
actual_url = convert(command)
|
92
|
-
expected_url = build_url("table_create", arguments)
|
93
|
-
|
94
|
-
assert_equal(expected_url, actual_url)
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_without_arguments
|
98
|
-
command = "dump"
|
99
|
-
actual_url = convert(command)
|
100
|
-
expected_url = build_url(command, {})
|
101
|
-
|
102
|
-
assert_equal(expected_url, actual_url)
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_load_json_array
|
106
|
-
load_command = "load --table Sites"
|
107
|
-
load_values = <<EOF
|
108
|
-
[
|
109
|
-
["_key","uri"],
|
110
|
-
["groonga","http://groonga.org/"],
|
111
|
-
["razil","http://razil.jp/"]
|
112
|
-
]
|
113
|
-
EOF
|
114
|
-
command = "#{load_command}\n#{load_values}"
|
115
|
-
actual_url = convert(command)
|
116
|
-
|
117
|
-
load_values_without_columns =
|
118
|
-
'[["groonga","http://groonga.org/"],["razil","http://razil.jp/"]]'
|
119
|
-
arguments = {
|
120
|
-
"table" => "Sites",
|
121
|
-
"columns" => "_key,uri",
|
122
|
-
"values" => load_values_without_columns
|
123
|
-
}
|
124
|
-
expected_url = build_url("load", arguments)
|
125
|
-
|
126
|
-
assert_equal(expected_url, actual_url)
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_load_json_object
|
130
|
-
load_command = "load --table Sites"
|
131
|
-
load_values = <<EOF
|
132
|
-
[
|
133
|
-
{"_key": "ruby", "uri": "http://ruby-lang.org/"}
|
134
|
-
]
|
135
|
-
EOF
|
136
|
-
command = "#{load_command}\n#{load_values}"
|
137
|
-
actual_url = convert(command)
|
138
|
-
|
139
|
-
arguments = {
|
140
|
-
"table" => "Sites",
|
141
|
-
"values" => '[{"_key":"ruby","uri":"http://ruby-lang.org/"}]'
|
142
|
-
}
|
143
|
-
expected_url = build_url("load", arguments)
|
144
|
-
|
145
|
-
assert_equal(expected_url, actual_url)
|
146
|
-
end
|
147
|
-
|
148
|
-
def test_value_single_quote
|
149
|
-
command = "select Sites --output_columns '_key, uri'"
|
150
|
-
arguments = {
|
151
|
-
"table" => "Sites",
|
152
|
-
"output_columns" => "_key, uri",
|
153
|
-
}
|
154
|
-
actual_url = convert(command)
|
155
|
-
expected_url = build_url("select", arguments)
|
156
|
-
|
157
|
-
assert_equal(expected_url, actual_url)
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_value_double_quote_in_single_quote
|
161
|
-
command = "select Sites --filter 'uri @ \"ruby\"'"
|
162
|
-
arguments = {
|
163
|
-
"table" => "Sites",
|
164
|
-
"filter" => "uri @ \"ruby\"",
|
165
|
-
}
|
166
|
-
actual_url = convert(command)
|
167
|
-
expected_url = build_url("select", arguments)
|
168
|
-
|
169
|
-
assert_equal(expected_url, actual_url)
|
170
|
-
end
|
171
|
-
|
172
|
-
def test_value_double_quote
|
173
|
-
command = "select Sites --output_columns \"_key, uri\""
|
174
|
-
arguments = {
|
175
|
-
"table" => "Sites",
|
176
|
-
"output_columns" => "_key, uri",
|
177
|
-
}
|
178
|
-
actual_url = convert(command)
|
179
|
-
expected_url = build_url("select", arguments)
|
180
|
-
|
181
|
-
assert_equal(expected_url, actual_url)
|
182
|
-
end
|
183
|
-
|
184
|
-
private
|
185
|
-
def convert(command)
|
186
|
-
converter = Grntest::Tester::CommandFormatConverter.new(command)
|
187
|
-
converter.to_url
|
188
|
-
end
|
189
|
-
|
190
|
-
def build_url(command, named_arguments)
|
191
|
-
url = "/d/#{command}"
|
192
|
-
query_parameters = []
|
193
|
-
|
194
|
-
sorted_arguments = named_arguments.sort_by do |name, _|
|
195
|
-
name
|
196
|
-
end
|
197
|
-
sorted_arguments.each do |name, argument|
|
198
|
-
query_parameters << "#{CGI.escape(name)}=#{CGI.escape(argument)}"
|
199
|
-
end
|
200
|
-
unless query_parameters.empty?
|
201
|
-
url << "?"
|
202
|
-
url << query_parameters.join("&")
|
203
|
-
end
|
204
|
-
url
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|