htty 1.1.6 → 1.2.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.
Files changed (84) hide show
  1. data/History.markdown +46 -0
  2. data/README.markdown +12 -12
  3. data/VERSION +1 -1
  4. data/lib/htty/cli.rb +10 -0
  5. data/lib/htty/cli/command.rb +50 -41
  6. data/lib/htty/cli/commands/http_put.rb +3 -0
  7. data/lib/htty/cli/commands/query_unset.rb +4 -2
  8. data/lib/htty/cli/http_method_command.rb +5 -3
  9. data/spec/integration/htty/cli/commands/query_add_spec.rb +51 -0
  10. data/spec/integration/htty/cli/commands/query_remove_spec.rb +37 -0
  11. data/spec/integration/htty/cli/commands/query_set_spec.rb +72 -0
  12. data/spec/integration/htty/cli/commands/query_unset_spec.rb +37 -0
  13. data/spec/unit/htty/cli/commands/address_spec.rb +103 -0
  14. data/spec/unit/htty/cli/commands/body_clear_spec.rb +64 -0
  15. data/spec/unit/htty/cli/commands/body_request_spec.rb +72 -0
  16. data/spec/unit/htty/cli/commands/body_response_spec.rb +70 -0
  17. data/spec/unit/htty/cli/commands/body_set_spec.rb +71 -0
  18. data/spec/unit/htty/cli/commands/body_unset_spec.rb +69 -0
  19. data/spec/unit/htty/cli/commands/cd_spec.rb +57 -0
  20. data/spec/unit/htty/cli/commands/cookie_add_spec.rb +64 -0
  21. data/spec/unit/htty/cli/commands/cookie_remove_spec.rb +64 -0
  22. data/spec/unit/htty/cli/commands/cookies_add_spec.rb +78 -0
  23. data/spec/unit/htty/cli/commands/cookies_clear_spec.rb +64 -0
  24. data/spec/unit/htty/cli/commands/cookies_remove_all_spec.rb +73 -0
  25. data/spec/unit/htty/cli/commands/cookies_remove_spec.rb +69 -0
  26. data/spec/unit/htty/cli/commands/cookies_spec.rb +76 -0
  27. data/spec/unit/htty/cli/commands/cookies_use_spec.rb +75 -0
  28. data/spec/unit/htty/cli/commands/delete_spec.rb +64 -0
  29. data/spec/unit/htty/cli/commands/exit_spec.rb +64 -0
  30. data/spec/unit/htty/cli/commands/follow_spec.rb +70 -0
  31. data/spec/unit/htty/cli/commands/form_add_spec.rb +64 -0
  32. data/spec/unit/htty/cli/commands/form_clear_spec.rb +64 -0
  33. data/spec/unit/htty/cli/commands/form_remove_all_spec.rb +66 -0
  34. data/spec/unit/htty/cli/commands/form_remove_spec.rb +57 -0
  35. data/spec/unit/htty/cli/commands/form_spec.rb +57 -0
  36. data/spec/unit/htty/cli/commands/fragment_clear_spec.rb +64 -0
  37. data/spec/unit/htty/cli/commands/fragment_set_spec.rb +73 -0
  38. data/spec/unit/htty/cli/commands/fragment_unset_spec.rb +72 -0
  39. data/spec/unit/htty/cli/commands/get_spec.rb +64 -0
  40. data/spec/unit/htty/cli/commands/header_set_spec.rb +64 -0
  41. data/spec/unit/htty/cli/commands/header_unset_spec.rb +64 -0
  42. data/spec/unit/htty/cli/commands/headers_clear_spec.rb +64 -0
  43. data/spec/unit/htty/cli/commands/headers_request_spec.rb +81 -0
  44. data/spec/unit/htty/cli/commands/headers_response_spec.rb +77 -0
  45. data/spec/unit/htty/cli/commands/headers_set_spec.rb +74 -0
  46. data/spec/unit/htty/cli/commands/headers_unset_all_spec.rb +71 -0
  47. data/spec/unit/htty/cli/commands/headers_unset_spec.rb +63 -0
  48. data/spec/unit/htty/cli/commands/help_spec.rb +67 -0
  49. data/spec/unit/htty/cli/commands/history_spec.rb +65 -0
  50. data/spec/unit/htty/cli/commands/history_verbose_spec.rb +72 -0
  51. data/spec/unit/htty/cli/commands/host_set_spec.rb +71 -0
  52. data/spec/unit/htty/cli/commands/http_delete_spec.rb +73 -0
  53. data/spec/unit/htty/cli/commands/http_get_spec.rb +75 -0
  54. data/spec/unit/htty/cli/commands/http_head_spec.rb +69 -0
  55. data/spec/unit/htty/cli/commands/http_options_spec.rb +69 -0
  56. data/spec/unit/htty/cli/commands/http_post_spec.rb +71 -0
  57. data/spec/unit/htty/cli/commands/http_put_spec.rb +69 -0
  58. data/spec/unit/htty/cli/commands/http_trace_spec.rb +69 -0
  59. data/spec/unit/htty/cli/commands/path_set_spec.rb +72 -0
  60. data/spec/unit/htty/cli/commands/port_set_spec.rb +73 -0
  61. data/spec/unit/htty/cli/commands/post_spec.rb +64 -0
  62. data/spec/unit/htty/cli/commands/put_spec.rb +64 -0
  63. data/spec/unit/htty/cli/commands/query_add_spec.rb +67 -36
  64. data/spec/unit/htty/cli/commands/query_clear_spec.rb +64 -0
  65. data/spec/unit/htty/cli/commands/query_remove_spec.rb +69 -24
  66. data/spec/unit/htty/cli/commands/query_set_spec.rb +59 -49
  67. data/spec/unit/htty/cli/commands/query_unset_all_spec.rb +73 -0
  68. data/spec/unit/htty/cli/commands/query_unset_spec.rb +75 -0
  69. data/spec/unit/htty/cli/commands/quit_spec.rb +64 -0
  70. data/spec/unit/htty/cli/commands/reuse_spec.rb +72 -0
  71. data/spec/unit/htty/cli/commands/scheme_set_spec.rb +74 -0
  72. data/spec/unit/htty/cli/commands/ssl_verification_off_spec.rb +67 -0
  73. data/spec/unit/htty/cli/commands/ssl_verification_on_spec.rb +60 -0
  74. data/spec/unit/htty/cli/commands/ssl_verification_spec.rb +65 -0
  75. data/spec/unit/htty/cli/commands/status_spec.rb +73 -0
  76. data/spec/unit/htty/cli/commands/undo_spec.rb +57 -0
  77. data/spec/unit/htty/cli/commands/userinfo_clear_spec.rb +64 -0
  78. data/spec/unit/htty/cli/commands/userinfo_set_spec.rb +75 -0
  79. data/spec/unit/htty/cli/commands/userinfo_unset_spec.rb +72 -0
  80. data/spec/unit/htty/cli_spec.rb +8 -2
  81. data/spec/unit/htty/ordered_hash_spec.rb +14 -24
  82. data/spec/unit/htty/preferences_spec.rb +1 -1
  83. data/spec/unit/htty/request_spec.rb +454 -463
  84. metadata +80 -20
data/History.markdown CHANGED
@@ -1,6 +1,52 @@
1
1
  Version history for the _htty_ project
2
2
  ======================================
3
3
 
4
+ v1.2.0, Wed 12/01/2010
5
+ ---------------------
6
+
7
+ * Added support for Tab-key completion of user input [[carsonmcdonald](http://github.com/carsonmcdonald "carsonmcdonald at GitHub")]
8
+ * Enhanced the `query-unset` command to accept an optional _value_ argument [[mattsa](http://github.com/mattsa "mattsa at GitHub")]
9
+
10
+ v1.1.6, Mon 11/22/2010
11
+ ---------------------
12
+
13
+ * Added the `query-add` and `query-remove` commands [[mattsa](http://github.com/mattsa "mattsa at GitHub")]:
14
+ * Added context-sensitive help in connection with server certificate verification
15
+ * Upgraded various dependencies
16
+
17
+ v1.1.5, Wed 10/20/2010
18
+ ---------------------
19
+
20
+ * Added the `ssl-verification*` commands for controlling the verification of server certificates [[dtjm](http://github.com/dtjm "dtjm at GitHub")]
21
+ * Fixed a bug in the `query-set` command [[mattsa](http://github.com/mattsa "mattsa at GitHub")]
22
+ * Fixed a Ruby < v1.9 compatibility problem
23
+
24
+ v1.1.4, Sat 10/16/2010
25
+ ---------------------
26
+
27
+ * Enhanced the `query-set` command [[mattsa](http://github.com/mattsa "mattsa at GitHub")] to:
28
+ - Accept an arbitrary number of arguments
29
+ - Support valueless keys
30
+ - Support duplicate keys
31
+ - Support keys with brackets in their names, à la Rails
32
+
33
+ v1.1.3, Tue 10/12/2010
34
+ ---------------------
35
+
36
+ * Fixed a bug in the arrow keys and Emacs key bindings support within the `body-set` command [ephox-rob/[rojotek](http://github.com/rojotek "rojotek at GitHub")]
37
+ * Fixed a bug involving empty response bodies such as are received with _304 Not Modified_
38
+
39
+ v1.1.2, Wed 9/29/2010
40
+ ---------------------
41
+
42
+ * Stopped recording blank and repeated entries in the command history [[jgorset](http://github.com/jgorset "jgorset at GitHub")]
43
+ * Fixed a bug in the help index
44
+
45
+ v1.1.1, Tue 9/28/2010
46
+ ---------------------
47
+
48
+ * Classified RubyGems for building documentation as development-only dependencies
49
+
4
50
  v1.1.0, Tue 9/28/2010
5
51
  ---------------------
6
52
 
data/README.markdown CHANGED
@@ -27,7 +27,7 @@
27
27
  |____| |____| / ______|
28
28
  \/
29
29
 
30
- [htty](http://htty.github.com) is a console application for interacting with HTTP servers. It’s something of a cross between _curl_ and the Lynx browser.
30
+ [htty](http://htty.github.com) is a console application for interacting with HTTP servers. It’s something of a cross between [cURL](http://curl.haxx.se) and a browser.
31
31
 
32
32
  See what’s changed lately by reading the [project history](http://htty.github.com/file.History.html). [![Flattr this](http://api.flattr.com/button/button-compact-static-100x17.png)](http://flattr.com/thing/68277/htty-the-HTTP-TTY "Flattr this")
33
33
 
@@ -43,7 +43,7 @@ You’ll need Ruby and RubyGems. It’s known to work well under OS X against Ru
43
43
  Features
44
44
  ========
45
45
 
46
- * Intuitive commands and command aliases
46
+ * Intuitive, Tab-completed commands and command aliases
47
47
  * Support for familiar HTTP methods _GET_, _POST_, _PUT_, and _DELETE_, as well as _HEAD_, _OPTIONS_ and _TRACE_
48
48
  * Support for HTTP Secure connections and HTTP Basic Authentication
49
49
  * Automatic URL-encoding of userinfo, paths, query-string parameters, and page fragments
@@ -159,8 +159,8 @@ Type `body-set` to enter body data, and terminate it by typing Return three time
159
159
  Different response codes are rendered with colors that suggest their meaning:
160
160
 
161
161
  * Response codes between 200 and 299 appear <span style="background-color: green; color: black; font-weight: bold; padding: 0 0.25em 0 0.25em;">black on green</span> to indicate success
162
- * Response codes between 300 and 399 appear <span style="background-color: blue; color: white; font-weight: bold; padding: 0 0.25em 0 0.25em;">white on blue</span> to indicate redirection
163
- * Response codes between 400 and 499 appear <span style="background-color: red; color: white; font-weight: bold; padding: 0 0.25em 0 0.25em;">white on red</span> to indicate failure
162
+ * Response codes between 300 and 399 appear <span style="background-color: darkblue; color: white; font-weight: bold; padding: 0 0.25em 0 0.25em;">white on blue</span> to indicate redirection
163
+ * Response codes between 400 and 499 appear <span style="background-color: darkred; color: white; font-weight: bold; padding: 0 0.25em 0 0.25em;">white on red</span> to indicate failure
164
164
  * Response codes between 500 and 599 appear <span style="background-color: yellow; color: black; font-weight: bold; padding: 0 0.25em 0 0.25em; text-decoration: blink;">flashing black on yellow</span> to indicate a server error
165
165
 
166
166
  ![Sinatra application example #2](http://htty.github.com/images/sinatra2.png)
@@ -196,11 +196,6 @@ Using any of the forthcoming `form` commands will clear any non-form content in
196
196
 
197
197
  You will also be able to pop open a browser window containing request and response bodies.
198
198
 
199
- Shiny autocomplete goodness
200
- ---------------------------
201
-
202
- We’ll have command command autocompletion, and possibly also Tab key navigation of forms.
203
-
204
199
  Custom command aliases and shell emulation of _http-console_
205
200
  ------------------------------------------------------------
206
201
 
@@ -227,10 +222,15 @@ Credits [![Flattr this](http://api.flattr.com/button/button-compact-static-100x1
227
222
 
228
223
  The author, [Nils Jonsson](mailto:htty@nilsjonsson.com), owes a debt of inspiration to the [_http-console_](http://github.com/cloudhead/http-console) project.
229
224
 
230
- Thanks to contributors:
225
+ Thanks to [contributors](https://github.com/htty/htty/contributors "htty contributors at GitHub") (in alphabetical order):
231
226
 
232
- * Bo Frederiksen ([bofrede](http://github.com/bofrede "bofrede at GitHub")) for work on the CLI
233
- * Robert Pitts ([rbxbx](http://github.com/rbxbx "rbxbx at GitHub")) for work on the CLI and on RSpec specs
227
+ * Rob Dawson (ephox-rob/[rojotek](https://github.com/rojotek "rojotek at GitHub"))
228
+ * Bo Frederiksen ([bofrede](https://github.com/bofrede "bofrede at GitHub"))
229
+ * Johannes Gorset ([jgorset](https://github.com/jgorset "jgorset at GitHub"))
230
+ * Carson McDonald ([carsonmcdonald](https://github.com/carsonmcdonald "carsonmcdonald at GitHub"))
231
+ * Sam Nguyen ([dtjm](https://github.com/dtjm "dtjm at GitHub"))
232
+ * Robert Pitts ([rbxbx](https://github.com/rbxbx "rbxbx at GitHub"))
233
+ * Matt Sanders ([mattsa](https://github.com/mattsa "mattsa at GitHub"))
234
234
 
235
235
  License
236
236
  =======
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.6
1
+ 1.2.0
data/lib/htty/cli.rb CHANGED
@@ -23,6 +23,7 @@ class HTTY::CLI
23
23
  end
24
24
  HTTY::Session.new(everything_but_options.first)
25
25
  end
26
+ register_completion_proc
26
27
  end
27
28
 
28
29
  # Takes over stdin, stdout, and stderr to expose #session to command-line
@@ -79,6 +80,15 @@ private
79
80
  HTTY::CLI::Commands.build_for command_line, :session => session
80
81
  end
81
82
 
83
+ def register_completion_proc
84
+ Readline.completion_proc = proc do |input|
85
+ autocomplete_list = HTTY::CLI::Commands.select do |c|
86
+ c.complete_for? input
87
+ end
88
+ autocomplete_list.collect(&:raw_name)
89
+ end
90
+ end
91
+
82
92
  def repeat?(command_line)
83
93
  command_line == Readline::HISTORY.to_a[-2]
84
94
  end
@@ -84,6 +84,13 @@ class HTTY::CLI::Command
84
84
  nil
85
85
  end
86
86
 
87
+ # Returns +true+ if the specified _command_line_ can be autocompleted to the
88
+ # command.
89
+ def self.complete_for?(command_line)
90
+ command_name = command_line_for_class_name(name)
91
+ command_name[0...command_line.length] == command_line
92
+ end
93
+
87
94
  # Returns the help text for the command.
88
95
  def self.help
89
96
  return "Alias for #{strong alias_for.command_line}" if alias_for
@@ -96,25 +103,10 @@ class HTTY::CLI::Command
96
103
  "#{help}."
97
104
  end
98
105
 
99
- # Returns an array of the classes or modules that contain this command.
100
- def self.namespaces
101
- container = nil
102
- name.split('::')[0...-1].collect do |element|
103
- if container.nil?
104
- container = instance_eval("::#{element}", __FILE__, __LINE__)
105
- else
106
- container = container.module_eval(element, __FILE__, __LINE__)
107
- end
108
- end
109
- end
110
-
111
- # Returns an array of the constants that share this command's namespace.
112
- def self.namespace_siblings
113
- namespace = namespaces.last
114
- other_commands = namespace.constants.collect do |constant|
115
- type = namespace.module_eval(constant.to_s, __FILE__, __LINE__)
116
- (type == self) ? nil : type
117
- end.compact
106
+ # Returns the full name of the command as it appears on the command line,
107
+ # without abbreviations.
108
+ def self.raw_name
109
+ command_line_for_class_name name
118
110
  end
119
111
 
120
112
  # Returns related command classes for the command.
@@ -135,10 +127,49 @@ protected
135
127
 
136
128
  private
137
129
 
130
+ def self.command_line_for_class_name(class_name)
131
+ class_name.split('::').last.gsub(/(.)([A-Z])/, '\1-\2').downcase
132
+ end
133
+
134
+ def self.completion_optional(text)
135
+ return nil if text.empty?
136
+ char_length = (text[0..0] == '\\') ? 2 : 1
137
+ rest = (text.length > char_length) ?
138
+ completion_optional(text[char_length..-1]) :
139
+ nil
140
+ "(?:#{text[0...char_length]}#{rest})?"
141
+ end
142
+
138
143
  def self.cookies?(request)
139
144
  !request.cookies.empty?
140
145
  end
141
146
 
147
+ def self.make_command_line_regexp
148
+ pattern = Regexp.escape(command_line).gsub(/\\\[(.+)\\\]/) do |optional|
149
+ completion_optional($1)
150
+ end
151
+ Regexp.new "^#{pattern}(\\s.+)?$", Regexp::IGNORECASE
152
+ end
153
+
154
+ def self.namespaces
155
+ container = nil
156
+ name.split('::')[0...-1].collect do |element|
157
+ if container.nil?
158
+ container = instance_eval("::#{element}", __FILE__, __LINE__)
159
+ else
160
+ container = container.module_eval(element, __FILE__, __LINE__)
161
+ end
162
+ end
163
+ end
164
+
165
+ def self.namespace_siblings
166
+ namespace = namespaces.last
167
+ other_commands = namespace.constants.collect do |constant|
168
+ type = namespace.module_eval(constant.to_s, __FILE__, __LINE__)
169
+ (type == self) ? nil : type
170
+ end.compact
171
+ end
172
+
142
173
  public
143
174
 
144
175
  # Returns the arguments provided to the command.
@@ -182,26 +213,4 @@ protected
182
213
  self
183
214
  end
184
215
 
185
- private
186
-
187
- def self.command_line_for_class_name(class_name)
188
- class_name.split('::').last.gsub(/(.)([A-Z])/, '\1-\2').downcase
189
- end
190
-
191
- def self.completion_optional(text)
192
- return nil if text.empty?
193
- char_length = (text[0..0] == '\\') ? 2 : 1
194
- rest = (text.length > char_length) ?
195
- completion_optional(text[char_length..-1]) :
196
- nil
197
- "(?:#{text[0...char_length]}#{rest})?"
198
- end
199
-
200
- def self.make_command_line_regexp
201
- pattern = Regexp.escape(command_line).gsub(/\\\[(.+)\\\]/) do |optional|
202
- completion_optional($1)
203
- end
204
- Regexp.new "^#{pattern}(\\s.+)?$", Regexp::IGNORECASE
205
- end
206
-
207
216
  end
@@ -1,5 +1,8 @@
1
1
  require File.expand_path("#{File.dirname __FILE__}/../command")
2
2
  require File.expand_path("#{File.dirname __FILE__}/../http_method_command")
3
+ require File.expand_path("#{File.dirname __FILE__}/http_get")
4
+ require File.expand_path("#{File.dirname __FILE__}/http_post")
5
+ require File.expand_path("#{File.dirname __FILE__}/http_delete")
3
6
 
4
7
  module HTTY; end
5
8
 
@@ -26,7 +26,7 @@ class HTTY::CLI::Commands::QueryUnset < HTTY::CLI::Command
26
26
  # Returns the arguments for the command-line usage of the _query-unset_
27
27
  # command.
28
28
  def self.command_line_arguments
29
- 'NAME'
29
+ 'NAME [VALUE]'
30
30
  end
31
31
 
32
32
  # Returns the help text for the _query-unset_ command.
@@ -63,7 +63,9 @@ class HTTY::CLI::Commands::QueryUnset < HTTY::CLI::Command
63
63
  def perform
64
64
  add_request_if_has_response do |request|
65
65
  self.class.notify_if_cookies_cleared request do
66
- request.query_unset(*escape_or_warn_of_escape_sequences(arguments))
66
+ unset_method = (arguments.length == 2) ? :query_remove : :query_unset
67
+ request.send(unset_method,
68
+ *escape_or_warn_of_escape_sequences(arguments))
67
69
  end
68
70
  end
69
71
  end
@@ -1,7 +1,9 @@
1
- require File.expand_path("#{File.dirname __FILE__}/../request")
2
1
  require File.expand_path("#{File.dirname __FILE__}/display")
3
- require File.expand_path("#{File.dirname __FILE__}/commands/cookies_use")
4
- require File.expand_path("#{File.dirname __FILE__}/commands/ssl_verification_off")
2
+ # TODO: See if we can avoid circular references without omitting these 'require' statements
3
+ # require File.expand_path("#{File.dirname __FILE__}/../request")
4
+ # require File.expand_path("#{File.dirname __FILE__}/commands/cookies_use")
5
+ # require File.expand_path("#{File.dirname __FILE__}/commands/follow")
6
+ # require File.expand_path("#{File.dirname __FILE__}/commands/ssl_verification_off")
5
7
 
6
8
  module HTTY; end
7
9
 
@@ -0,0 +1,51 @@
1
+ require 'rspec'
2
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/session")
3
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/cli/commands/query_add")
4
+
5
+ describe HTTY::CLI::Commands::QueryAdd do
6
+ let :klass do
7
+ subject.class
8
+ end
9
+
10
+ let :session do
11
+ HTTY::Session.new nil
12
+ end
13
+
14
+ def instance(*arguments)
15
+ klass.new :session => session, :arguments => arguments
16
+ end
17
+
18
+ describe 'with key argument only' do
19
+ describe 'without key already present' do
20
+ it 'should add key' do
21
+ instance('test').perform
22
+ session.requests.last.uri.query.should == 'test'
23
+ end
24
+ end
25
+
26
+ describe 'with key already present' do
27
+ it 'should add key' do
28
+ session.requests.last.uri.query = 'test=true'
29
+ instance('test').perform
30
+ session.requests.last.uri.query.should == 'test=true&test'
31
+ end
32
+ end
33
+ end
34
+
35
+ describe 'with key and value arguments' do
36
+ describe 'without key already present' do
37
+ it 'should add key and value' do
38
+ instance('test', 'true').perform
39
+ session.requests.last.uri.query.should == 'test=true'
40
+ end
41
+ end
42
+
43
+ describe 'with key already present' do
44
+ it 'should add key and value' do
45
+ session.requests.last.uri.query = 'test=true'
46
+ instance('test', 'false').perform
47
+ session.requests.last.uri.query.should == 'test=true&test=false'
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ require 'rspec'
2
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/session")
3
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/cli/commands/query_remove")
4
+
5
+ describe HTTY::CLI::Commands::QueryRemove do
6
+ let :klass do
7
+ subject.class
8
+ end
9
+
10
+ let :session do
11
+ HTTY::Session.new nil
12
+ end
13
+
14
+ def instance(*arguments)
15
+ klass.new :session => session, :arguments => arguments
16
+ end
17
+
18
+ describe 'with existing query string with duplicate keys set' do
19
+ before :each do
20
+ session.requests.last.uri.query = 'test=true&test=false'
21
+ end
22
+
23
+ describe 'with only key specified' do
24
+ it 'should remove last entry' do
25
+ instance('test').perform
26
+ session.requests.last.uri.query.should == 'test=true'
27
+ end
28
+ end
29
+
30
+ describe 'with key and value specified' do
31
+ it 'should remove matching entry only' do
32
+ instance('test', 'true').perform
33
+ session.requests.last.uri.query.should == 'test=false'
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,72 @@
1
+ require 'rspec'
2
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/session")
3
+ require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/cli/commands/query_set")
4
+
5
+ describe HTTY::CLI::Commands::QuerySet do
6
+ let :klass do
7
+ subject.class
8
+ end
9
+
10
+ let :session do
11
+ HTTY::Session.new nil
12
+ end
13
+
14
+ def instance(*arguments)
15
+ klass.new :session => session, :arguments => arguments
16
+ end
17
+
18
+ describe 'with one argument' do
19
+ it 'should assign a single key' do
20
+ instance('test').perform
21
+ session.requests.last.uri.query.should == 'test'
22
+ end
23
+ end
24
+
25
+ describe 'with two arguments' do
26
+ it 'should assign a key-value pair' do
27
+ instance('test', 'true').perform
28
+ session.requests.last.uri.query.should == 'test=true'
29
+ end
30
+ end
31
+
32
+ describe 'with three arguments' do
33
+ it 'should assign a key-value pair and a valueless key' do
34
+ instance('test', 'true', 'more').perform
35
+ session.requests.last.uri.query.should == 'test=true&more'
36
+ end
37
+ end
38
+
39
+ describe 'with four arguments' do
40
+ it 'should assign two key-value pairs' do
41
+ instance('test', 'true', 'more', 'false').perform
42
+ session.requests.last.uri.query.should == 'test=true&more=false'
43
+ end
44
+ end
45
+
46
+ describe 'with duplicate keys' do
47
+ it 'should replace existing key' do
48
+ session.requests.last.uri.query = 'test=true'
49
+ instance('test', 'false').perform
50
+ session.requests.last.uri.query.should == 'test=false'
51
+ end
52
+
53
+ it 'should maintain field location' do
54
+ session.requests.last.uri.query = 'test=true&more=true'
55
+ instance('test', 'false').perform
56
+ session.requests.last.uri.query.should == 'test=false&more=true'
57
+ end
58
+
59
+ it 'should replace multiple instances with one' do
60
+ session.requests.last.uri.query = 'test=true&more=true&test=true'
61
+ instance('test', 'false').perform
62
+ session.requests.last.uri.query.should == 'test=false&more=true'
63
+ end
64
+
65
+ it 'should play nice with nested fields' do
66
+ session.requests.last.uri.query = 'test[my][]=1'
67
+ instance('test[my][]', '2').perform
68
+ instance('test', '3').perform
69
+ session.requests.last.uri.query.should == 'test[my][]=2&test=3'
70
+ end
71
+ end
72
+ end