yanapi 0.1.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,107 +1,172 @@
1
1
  require 'test/unit'
2
- require 'yanapi'
2
+ require 'yanapi/query'
3
3
  require 'fakeweb'
4
4
 
5
5
  class TestQuery < Test::Unit::TestCase
6
6
  def setup
7
- @params = {:appid => 'MyID', :method => 'questionSearch'}
7
+ @params = {
8
+ :method => 'questionSearch',
9
+ :query_params => {
10
+ :appid => 'YahooDemo',
11
+ :query => 'Haus',
12
+ :output => 'xml'
13
+ }
14
+ }
8
15
  end
9
16
  def teardown
10
17
  end
11
18
 
19
+ ## Structural tests
20
+
21
+ # It should have a public method <get>.
12
22
  def test_public_methods
13
23
  q = YANAPI::Query.new(@params)
14
24
  assert_respond_to(q, :get)
15
25
  end
16
26
 
27
+ # This class should declare the following constants.
17
28
  def test_constants
18
- assert_equal('http://answers.yahooapis.com', YANAPI::Query::HOST)
29
+ defined_constants = [:HOST,
30
+ :SERVICE,
31
+ :SERVICE_VERSION,
32
+ :VALID_PARAMS,
33
+ :REQUIRED_PARAMS,
34
+ :VALID_OUTPUT_FORMATS
35
+ ]
36
+ defined_constants.each do |const|
37
+ assert(YANAPI::Query.const_defined?(const))
38
+ end
39
+ end
40
+
41
+ # The following constants should have the given value and type.
42
+ def test_values_of_constants
43
+ assert_equal('http://answers.yahooapis.com',
44
+ YANAPI::Query::HOST)
19
45
  assert_equal('AnswersService', YANAPI::Query::SERVICE)
20
46
  assert_equal('V1', YANAPI::Query::SERVICE_VERSION)
21
- assert(YANAPI::VERSION.is_a?(String) && ! YANAPI::VERSION.empty?)
22
47
  end
23
48
 
49
+ ## Interface tests
50
+
51
+ # It should reject the input hash without <:appid> parameter.
24
52
  def test_missing_appid
25
- @params.delete(:appid)
26
- assert_raises(YANAPI::Error) do
27
- q = YANAPI::Query.new(@params)
28
- end
53
+ @params[:query_params].delete(:appid)
54
+ assert_raises(YANAPI::UserError) { YANAPI::Query.new(@params) }
29
55
  end
30
56
 
31
- # a Query can be only initialized with a valid value for :method
32
- def test_missing_method
33
- @params.delete(:method)
34
- assert_raises(YANAPI::Error) do
35
- q = YANAPI::Query.new(@params)
36
- end
57
+ # It should accept only predefined values of <:output>:
58
+ # xml|json|php|rss|nil
59
+ def test_output_semantics
60
+ @params[:query_params][:output] = 'trash'
61
+ assert_raises(YANAPI::UserError) { YANAPI::Query.new(@params) }
37
62
  end
63
+
64
+ # It should infer the output type in every case.
65
+ def test_output_type
66
+ @params[:query_params].delete(:output)
67
+ q = YANAPI::Query.new(@params)
68
+ output = q.instance_variable_get(:@output)
69
+ assert_equal('xml', output)
38
70
 
39
- # :method may have only the following values:
40
- # questionSearch|getByCategory|getQuestion|getByUser
41
- def test_method_semantics
42
- @params[:method] = 'someSampleMethod'
43
- assert_raises(YANAPI::Error) do
44
- q = YANAPI::Query.new(@params)
45
- end
71
+ @params[:query_params][:output] = 'php'
72
+ q = YANAPI::Query.new(@params)
73
+ output = q.instance_variable_get(:@output)
74
+ assert_equal('php', output)
46
75
  end
47
76
 
48
- # :output may be missing
49
- def test_missing_output
50
- @params.delete(:output)
51
- q = YANAPI::Query.new(@params)
52
- assert_equal('xml', q.output)
77
+ # It should allow only the combination: <:callback> and <'json'>.
78
+ def test_parameters_pairing
79
+ @params[:query_params][:output] = 'json'
80
+ @params[:query_params][:callback] = 'wrapper'
81
+ # It is analoguous to <assert_nothing_raised>.
82
+ YANAPI::Query.new(@params)
83
+
84
+ @params[:query_params][:output] = 'xml'
85
+ assert_raises(YANAPI::UserError) { YANAPI::Query.new(@params) }
86
+ @params[:query_params].delete(:output)
87
+ assert_raises(YANAPI::UserError) { YANAPI::Query.new(@params) }
53
88
  end
54
89
 
55
- # :output may be NIL or have values xml|json|php|rss
56
- def test_output_semantics
57
- @params[:output] = 'trash'
58
- assert_raises(YANAPI::Error) do
59
- q = YANAPI::Query.new(@params)
60
- end
90
+ # It should reject not unique values.
91
+ def test_uniqueness_of_values
92
+ @params[:query_params][:category_id] = ['123', 345]
93
+ assert_raises(YANAPI::UserError) { YANAPI::Query.new(@params) }
61
94
  end
62
-
63
95
 
64
- # :callback may be used only with :output => 'json'
65
- def test_parameters_pairing
66
- @params[:output] = 'json'
67
- @params[:callback] = 'wrapper'
68
- assert_nothing_raised {q = YANAPI::Query.new(@params)}
69
- @params[:output] = 'xml'
70
- assert_raises(YANAPI::Error) {YANAPI::Query.new(@params)}
71
- @params.delete(:output)
72
- assert_raises(YANAPI::Error) {YANAPI::Query.new(@params)}
73
- end
74
-
75
- # we can get an empty response set with valid xml structure
76
- # and the status code 200 HTTP OK
77
- # but we should declene this
96
+
97
+ ## Functional tests
98
+
99
+ # It should return <nil> if the server response contains
100
+ # no answer. It is possible if we out of range or search criteria
101
+ # are too strict.
78
102
  def test_empty_response
79
103
  q = YANAPI::Query.new(@params)
80
104
  page = File.open('test/data/empty_result.txt') {|f| f.read}
81
- FakeWeb.register_uri(:get, q.url, :response => page)
82
- assert_raises(YANAPI::EmptyResponse) {q.get}
105
+ url = q.instance_variable_get(:@url)
106
+ FakeWeb.register_uri(:get, url, :response => page)
107
+ assert_equal(nil, q.get)
83
108
  end
84
109
 
110
+ # It should return a valid answer.
111
+ def test_successfull_response
112
+ file = 'test/data/successfull_response.txt'
113
+ http_answer = File.open(file) { |f| f.read }
114
+ # Deleting the http answer header, leaving xml structure.
115
+ expected_api_answer = http_answer.sub(/^[^<]+/m, '')
116
+
117
+ query = YANAPI::Query.new(@params)
118
+ url = query.instance_variable_get(:@url)
119
+ FakeWeb.register_uri(:get, url, :response => http_answer)
120
+
121
+ actual_api_answer = query.get
122
+ assert_instance_of(String, actual_api_answer, 'Not String!')
123
+ assert_equal(expected_api_answer, actual_api_answer)
124
+
125
+ warn "\nAdd tests for <php>, <json> and <rss>!\n"
126
+ end
127
+
128
+ # It should fail with an appropriate exception
129
+ # with a response containing errors.
85
130
  def test_response_with_error
86
- q = YANAPI::Query.new(@params)
87
-
88
- page = File.open('test/data/response_with_error.txt') {|f| f.read}
89
- FakeWeb.register_uri(:get, q.url, :response => page)
90
- assert_raises(YANAPI::ContentError) {q.get}
91
-
92
- page = File.open('test/data/error_code.txt') {|f| f.read}
93
- FakeWeb.register_uri(:get, q.url, :response => page)
94
- assert_raises(YANAPI::ContentError) {q.get}
131
+ q = create_query('test/data/response_with_error.txt')
132
+ assert_raises(YANAPI::ContentError) { q.get }
133
+ end
95
134
 
96
- page = File.open('test/data/bad_xml.txt') {|f| f.read}
97
- FakeWeb.register_uri(:get, q.url, :response => page)
98
- assert_raises(YANAPI::ContentError) {q.get}
135
+ # It should fail with an appropriate exception
136
+ # with a non valid xml response.
137
+ def test_non_valid_xml
138
+ q = create_query('test/data/bad_xml.txt')
139
+ assert_raises(YANAPI::ContentError) { q.get }
140
+ end
141
+
142
+ # It should fail with an appropriate exception
143
+ # if given the error code 400
144
+ def test_code_400
145
+ q = create_query('test/data/code_400.txt')
146
+ assert_raises(YANAPI::ExternalError) { q.get }
99
147
  end
100
148
 
101
- def test_successfull_response
102
- q = YANAPI::Query.new(@params)
103
- page = File.open('test/data/successfull_response.txt') {|f| f.read}
104
- FakeWeb.register_uri(:get, q.url, :response => page)
105
- assert_nothing_raised {q.get}
149
+ # It should fail with an appropriate exception
150
+ # if given the error code 403
151
+ def test_code_403
152
+ q = create_query('test/data/code_403.txt')
153
+ assert_raises(YANAPI::ExternalError) { q.get }
154
+ end
155
+
156
+ # It should fail with an appropriate exception
157
+ # if given the error code 503
158
+ def test_code_503
159
+ q = create_query('test/data/code_503.txt')
160
+ assert_raises(YANAPI::ExternalError) { q.get }
161
+ end
162
+
163
+ # It is a helper method for asserting external and content errors.
164
+ def create_query(file)
165
+ query = YANAPI::Query.new(@params)
166
+ url = query.instance_variable_get(:@url)
167
+ page = File.open(file) { |f| f.read }
168
+ FakeWeb.register_uri(:get, url, :response => page)
169
+
170
+ query
106
171
  end
107
172
  end
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'yanapi'
2
+ require 'yanapi/question_query'
3
3
 
4
4
  class TestQuestionQuery < Test::Unit::TestCase
5
5
  def setup
@@ -7,4 +7,17 @@ class TestQuestionQuery < Test::Unit::TestCase
7
7
  def teardown
8
8
  end
9
9
 
10
+ # This class should declare the following constants.
11
+ def test_constants
12
+ defined_constants = [:VALID_PARAMS,
13
+ :REQUIRED_PARAMS
14
+ ]
15
+
16
+ defined_constants.each do |const|
17
+ assert(YANAPI::QuestionQuery.const_defined?(const))
18
+ end
19
+ end
20
+
21
+ def test_sample
22
+ end
10
23
  end #TestQuestionQuery
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'yanapi'
2
+ require 'yanapi/term_query'
3
3
  require 'fakeweb'
4
4
 
5
5
  class TestTermQuery < Test::Unit::TestCase
@@ -12,14 +12,27 @@ class TestTermQuery < Test::Unit::TestCase
12
12
  def teardown
13
13
  end
14
14
 
15
- # questionSearch needs a unique :query
16
- def test_missing_query
17
- @params.delete(:query)
18
- assert_raises(YANAPI::Error) do
19
- YANAPI::TermQuery.new(@params)
20
- end
15
+ # This class should declare the following constants.
16
+ def test_constants
17
+ defined_constants = [:REQUIRED_PARAMS,
18
+ :VALID_PARAMS
19
+ ]
20
+
21
+ defined_constants.each do |const|
22
+ assert(YANAPI::TermQuery.const_defined?(const))
23
+ end
21
24
  end
25
+
26
+ # !!! OBSOLETE, TESTED IN test_query.rb
27
+ # questionSearch needs a unique :query
28
+ # def test_missing_query
29
+ # @params.delete(:query)
30
+ # assert_raises(YANAPI::Error) do
31
+ # YANAPI::TermQuery.new(@params)
32
+ # end
33
+ # end
22
34
 
35
+ # !!! AMBIGUOUS, SPLIT Query AND TermQuery
23
36
  # parameters can be only: query|search_in|category_id|category_name|
24
37
  # region|date_range|sort|appid|type|start|results|output|callback|method
25
38
  def test_parameters_semantics
@@ -30,7 +43,4 @@ class TestTermQuery < Test::Unit::TestCase
30
43
  end
31
44
  end
32
45
 
33
- # validates presense of query
34
- # validates uniqueness of query
35
-
36
46
  end #TestTermQuery
@@ -1,9 +1,23 @@
1
1
  require 'test/unit'
2
- require 'yanapi'
2
+ require 'yanapi/user_query'
3
3
 
4
4
  class TestUserQuery < Test::Unit::TestCase
5
5
  def setup
6
6
  end
7
7
  def teardown
8
8
  end
9
+
10
+ # This class should declare the following constants.
11
+ def test_constants
12
+ defined_constants = [:VALID_PARAMS,
13
+ :REQUIRED_PARAMS
14
+ ]
15
+
16
+ defined_constants.each do |const|
17
+ assert(YANAPI::UserQuery.const_defined?(const))
18
+ end
19
+ end
20
+
21
+ def test_sample
22
+ end
9
23
  end #TestUserQuery
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ require 'yanapi/version'
3
+
4
+ class TestVersion < Test::Unit::TestCase
5
+
6
+ # This module should declare the following constants.
7
+ def test_constants
8
+ assert(YANAPI.const_defined?(:VERSION))
9
+ assert(YANAPI::VERSION.is_a?(String))
10
+ assert_equal(false, YANAPI::VERSION.empty?)
11
+ end
12
+ end
@@ -1,8 +1,9 @@
1
- require 'test/unit'
2
-
3
1
  require 'test_query'
4
2
  require 'test_term_query'
5
3
  require 'test_category_query'
6
4
  require 'test_user_query'
7
5
  require 'test_question_query'
8
6
  require 'test_common'
7
+ require 'test_version'
8
+ require 'test_api'
9
+ require 'test_integration'
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yanapi
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 17
4
5
  prerelease:
5
- version: 0.1.1
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 1
10
+ version: 0.3.1
6
11
  platform: ruby
7
12
  authors:
8
13
  - Andrei Beliankou
@@ -10,8 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-04-06 00:00:00 +02:00
14
- default_executable:
18
+ date: 2011-08-05 00:00:00 Z
15
19
  dependencies:
16
20
  - !ruby/object:Gem::Dependency
17
21
  name: nokogiri
@@ -21,6 +25,9 @@ dependencies:
21
25
  requirements:
22
26
  - - ">="
23
27
  - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
24
31
  version: "0"
25
32
  type: :runtime
26
33
  version_requirements: *id001
@@ -32,6 +39,9 @@ dependencies:
32
39
  requirements:
33
40
  - - ">="
34
41
  - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
35
45
  version: "0"
36
46
  type: :development
37
47
  version_requirements: *id002
@@ -42,8 +52,9 @@ executables: []
42
52
  extensions: []
43
53
 
44
54
  extra_rdoc_files:
45
- - README.rdoc
55
+ - README
46
56
  - LICENSE
57
+ - CHANGELOG
47
58
  files:
48
59
  - lib/yanapi/error.rb
49
60
  - lib/yanapi/user_query.rb
@@ -52,32 +63,43 @@ files:
52
63
  - lib/yanapi/common.rb
53
64
  - lib/yanapi/category_query.rb
54
65
  - lib/yanapi/version.rb
66
+ - lib/yanapi/api.rb
55
67
  - lib/yanapi/query.rb
56
68
  - lib/yanapi.rb
57
- - README.rdoc
58
- - LICENSE
59
- - Rakefile
60
69
  - README
70
+ - LICENSE
71
+ - CHANGELOG
61
72
  - test/test_yanapi.rb
73
+ - test/test_api.rb
62
74
  - test/test_user_query.rb
75
+ - test/test_integration.rb
76
+ - test/integration_test_data/test_question_query.txt
77
+ - test/integration_test_data/test_category_query.txt
78
+ - test/integration_test_data/test_empty_response.txt
79
+ - test/integration_test_data/test_term_query.txt
80
+ - test/integration_test_data/test_user_query.txt
63
81
  - test/test_query.rb
64
82
  - test/test_category_query.rb
65
83
  - test/test_term_query.rb
84
+ - test/test_version.rb
85
+ - test/test_helper.rb
66
86
  - test/test_common.rb
67
87
  - test/test_question_query.rb
88
+ - test/data/code_400.txt
68
89
  - test/data/bad_xml.txt
90
+ - test/data/code_503.txt
69
91
  - test/data/empty_result.txt
70
92
  - test/data/error_code.txt
71
93
  - test/data/response_with_error.txt
72
94
  - test/data/successfull_response.txt
73
- has_rdoc: true
95
+ - test/data/code_403.txt
74
96
  homepage: http://www.uni-trier.de/index.php?id=34451
75
97
  licenses: []
76
98
 
77
99
  post_install_message:
78
100
  rdoc_options:
79
101
  - -m
80
- - README.rdoc
102
+ - README
81
103
  require_paths:
82
104
  - lib
83
105
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -85,25 +107,49 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
107
  requirements:
86
108
  - - ">="
87
109
  - !ruby/object:Gem::Version
110
+ hash: 31
111
+ segments:
112
+ - 1
113
+ - 8
88
114
  version: "1.8"
89
115
  required_rubygems_version: !ruby/object:Gem::Requirement
90
116
  none: false
91
117
  requirements:
92
118
  - - ">="
93
119
  - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
94
123
  version: "0"
95
124
  requirements: []
96
125
 
97
126
  rubyforge_project: yanapi
98
- rubygems_version: 1.5.2
127
+ rubygems_version: 1.7.2
99
128
  signing_key:
100
129
  specification_version: 3
101
130
  summary: YANAPI is an API for Yahoo! Answers web services.
102
131
  test_files:
132
+ - test/test_yanapi.rb
133
+ - test/test_api.rb
134
+ - test/test_user_query.rb
135
+ - test/test_integration.rb
136
+ - test/integration_test_data/test_question_query.txt
137
+ - test/integration_test_data/test_category_query.txt
138
+ - test/integration_test_data/test_empty_response.txt
139
+ - test/integration_test_data/test_term_query.txt
140
+ - test/integration_test_data/test_user_query.txt
141
+ - test/test_query.rb
103
142
  - test/test_category_query.rb
143
+ - test/test_term_query.rb
144
+ - test/test_version.rb
145
+ - test/test_helper.rb
104
146
  - test/test_common.rb
105
- - test/test_query.rb
106
147
  - test/test_question_query.rb
107
- - test/test_term_query.rb
108
- - test/test_user_query.rb
109
- - test/test_yanapi.rb
148
+ - test/data/code_400.txt
149
+ - test/data/bad_xml.txt
150
+ - test/data/code_503.txt
151
+ - test/data/empty_result.txt
152
+ - test/data/error_code.txt
153
+ - test/data/response_with_error.txt
154
+ - test/data/successfull_response.txt
155
+ - test/data/code_403.txt