elibri_api_client 1.0.5 → 1.1.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.
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -10
- data/README.rdoc +14 -9
- data/elibri_api_client.gemspec +6 -5
- data/lib/elibri_api_client/api_adapters/v1.rb +16 -64
- data/lib/elibri_api_client/api_adapters/v1_helpers.rb +56 -38
- data/lib/elibri_api_client/version.rb +2 -2
- data/lib/elibri_api_client.rb +2 -2
- data/test/elibri_api_client_test.rb +1 -1
- data/test/elibri_api_v1_adapter_product_test.rb +3 -3
- data/test/elibri_api_v1_adapter_publisher_test.rb +4 -4
- data/test/elibri_api_v1_adapter_queue_pop_test.rb +66 -0
- data/test/elibri_api_v1_adapter_queue_test.rb +17 -41
- data/test/elibri_api_v1_adapter_test.rb +134 -188
- data/test/helper.rb +1 -2
- metadata +6 -5
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -3,7 +3,7 @@ GEM
|
|
3
3
|
specs:
|
4
4
|
activesupport (3.1.0.rc1)
|
5
5
|
multi_json (~> 1.0)
|
6
|
-
|
6
|
+
coderay (0.9.8)
|
7
7
|
crack (0.1.8)
|
8
8
|
git (1.2.5)
|
9
9
|
httparty (0.7.8)
|
@@ -12,20 +12,23 @@ GEM
|
|
12
12
|
bundler (~> 1.0)
|
13
13
|
git (>= 1.2.5)
|
14
14
|
rake
|
15
|
-
|
16
|
-
|
15
|
+
method_source (0.6.5)
|
16
|
+
ruby_parser (>= 2.0.5)
|
17
17
|
minitest (2.2.2)
|
18
18
|
mocha (0.9.12)
|
19
19
|
multi_json (1.0.3)
|
20
20
|
nokogiri (1.5.0)
|
21
|
+
pry (0.9.6)
|
22
|
+
coderay (>= 0.9.8)
|
23
|
+
method_source (>= 0.6.5)
|
24
|
+
ruby_parser (>= 2.0.5)
|
25
|
+
slop (~> 2.1.0)
|
21
26
|
rake (0.9.0)
|
22
|
-
rbx-require-relative (0.0.5)
|
23
27
|
rcov (0.9.9)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
linecache (>= 0.3)
|
28
|
+
ruby_parser (2.3.0)
|
29
|
+
sexp_processor (~> 3.0)
|
30
|
+
sexp_processor (3.0.6)
|
31
|
+
slop (2.1.0)
|
29
32
|
|
30
33
|
PLATFORMS
|
31
34
|
ruby
|
@@ -38,5 +41,5 @@ DEPENDENCIES
|
|
38
41
|
minitest
|
39
42
|
mocha
|
40
43
|
nokogiri (~> 1.5.0)
|
44
|
+
pry
|
41
45
|
rcov
|
42
|
-
ruby-debug
|
data/README.rdoc
CHANGED
@@ -29,21 +29,26 @@
|
|
29
29
|
# elibri.refill_all_queues!
|
30
30
|
|
31
31
|
elibri.pending_queues.each do |pending_queue|
|
32
|
-
|
33
|
-
# Taka kolejke identyfikujemy po ID i jej tresc pozniej nie ulega zmianie.
|
34
|
-
named_queue = pending_queue.pick_up!
|
35
|
-
|
36
|
-
# Majac kolejke nazwana, mozemy iterowac po jej produktach (ONIX):
|
37
|
-
named_queue.each_product_onix do |product_xml, product_no|
|
32
|
+
pending_queue.each_product do |product_xml|
|
38
33
|
# Otrzymujemy przeparsowany XML za pomoca Nokogiri
|
39
34
|
# product_xml.class => Nokogiri::XML::Element
|
40
35
|
|
41
|
-
puts
|
36
|
+
puts product_xml.css('RecordReference').text
|
42
37
|
end
|
43
38
|
end
|
44
39
|
|
45
|
-
==== 3b.
|
46
|
-
|
40
|
+
==== 3b. Pobieranie danych z konkretnej kolejki
|
41
|
+
|
42
|
+
meta = elibri.pending_queues.find {|queue| queue.name == 'meta'}
|
43
|
+
|
44
|
+
pop = meta.pop(:count => 5, :testing => true)
|
45
|
+
pop.each_product {|product_xml| puts product_xml.css('RecordReference').text }
|
46
|
+
|
47
|
+
last_pop = meta.last_pop
|
48
|
+
|
49
|
+
|
50
|
+
==== 3c. Znadz ostatnio pobrane kolejki
|
51
|
+
last_pop = elibri.last_pop_from_queue('meta')
|
47
52
|
|
48
53
|
|
49
54
|
== Copyright
|
data/elibri_api_client.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{elibri_api_client}
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marcin Urba\305\204ski"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-09-30}
|
13
13
|
s.description = %q{API client for elibri.com.pl publishing system}
|
14
14
|
s.email = %q{marcin@urbanski.vdl.pl}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
"test/elibri_api_client_test.rb",
|
34
34
|
"test/elibri_api_v1_adapter_product_test.rb",
|
35
35
|
"test/elibri_api_v1_adapter_publisher_test.rb",
|
36
|
+
"test/elibri_api_v1_adapter_queue_pop_test.rb",
|
36
37
|
"test/elibri_api_v1_adapter_queue_test.rb",
|
37
38
|
"test/elibri_api_v1_adapter_test.rb",
|
38
39
|
"test/helper.rb"
|
@@ -50,7 +51,7 @@ Gem::Specification.new do |s|
|
|
50
51
|
s.add_runtime_dependency(%q<httparty>, ["~> 0.7.8"])
|
51
52
|
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.5.0"])
|
52
53
|
s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
|
53
|
-
s.add_development_dependency(%q<
|
54
|
+
s.add_development_dependency(%q<pry>, [">= 0"])
|
54
55
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
55
56
|
s.add_development_dependency(%q<minitest>, [">= 0"])
|
56
57
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -60,7 +61,7 @@ Gem::Specification.new do |s|
|
|
60
61
|
s.add_dependency(%q<httparty>, ["~> 0.7.8"])
|
61
62
|
s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
|
62
63
|
s.add_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
|
63
|
-
s.add_dependency(%q<
|
64
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
64
65
|
s.add_dependency(%q<mocha>, [">= 0"])
|
65
66
|
s.add_dependency(%q<minitest>, [">= 0"])
|
66
67
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -71,7 +72,7 @@ Gem::Specification.new do |s|
|
|
71
72
|
s.add_dependency(%q<httparty>, ["~> 0.7.8"])
|
72
73
|
s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
|
73
74
|
s.add_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
|
74
|
-
s.add_dependency(%q<
|
75
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
75
76
|
s.add_dependency(%q<mocha>, [">= 0"])
|
76
77
|
s.add_dependency(%q<minitest>, [">= 0"])
|
77
78
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -11,7 +11,7 @@ module Elibri
|
|
11
11
|
|
12
12
|
include HTTParty
|
13
13
|
#--
|
14
|
-
#debug_output $stderr
|
14
|
+
# debug_output $stderr
|
15
15
|
#++
|
16
16
|
|
17
17
|
def initialize(host_uri, login, password) #:nodoc:
|
@@ -37,7 +37,7 @@ module Elibri
|
|
37
37
|
# pending_queues -> array
|
38
38
|
#
|
39
39
|
def pending_queues
|
40
|
-
resp = get '/queues
|
40
|
+
resp = get '/queues'
|
41
41
|
|
42
42
|
Array.new.tap do |pending_queues|
|
43
43
|
resp.parsed_response.css('queue').each do |queue_xml|
|
@@ -57,25 +57,6 @@ module Elibri
|
|
57
57
|
end
|
58
58
|
|
59
59
|
|
60
|
-
# Ostatnio utworzone nazwane kolejki. Gdy wysypie nam sie aplikacja, mozna przegladac ostatnie pickupy
|
61
|
-
# i ponownie pobierac z nich dane. Zwraca instance Elibri::ApiClient::ApiAdapters::V1::Queue
|
62
|
-
# call-seq:
|
63
|
-
# last_pickups -> array
|
64
|
-
#
|
65
|
-
def last_pickups
|
66
|
-
Array.new.tap do |last_pickups|
|
67
|
-
%w{meta stocks}.each do |queue_name|
|
68
|
-
begin
|
69
|
-
response = get "/queues/#{queue_name}/last_pick_up"
|
70
|
-
queue_xml = response.parsed_response.css('queue').first
|
71
|
-
last_pickups << Elibri::ApiClient::ApiAdapters::V1::Queue.build_from_xml(self, queue_xml)
|
72
|
-
rescue Exceptions::NoRecentlyPickedUpQueues # Ignoruj bledy o braku ostatnich pickupow.
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
60
|
# Zwroc liste dostepnych wydawnictw - instancje Elibri::ApiClient::ApiAdapters::V1::Publisher
|
80
61
|
# call-seq:
|
81
62
|
# publishers -> array
|
@@ -92,51 +73,22 @@ module Elibri
|
|
92
73
|
end
|
93
74
|
|
94
75
|
|
95
|
-
#
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
when String
|
103
|
-
queue_name = queue
|
104
|
-
else
|
105
|
-
raise 'Specify queue as name or Elibri::ApiClient::ApiAdapters::V1::Queue instance'
|
106
|
-
end
|
107
|
-
|
108
|
-
response = post "/queues/#{queue_name}/pick_up", :body => ' '
|
109
|
-
picked_up_queue_xml = response.parsed_response.css('pick_up queue').first
|
110
|
-
Elibri::ApiClient::ApiAdapters::V1::Queue.build_from_xml(self, picked_up_queue_xml)
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
def each_page_in_queue(queue, &block) #:nodoc:
|
115
|
-
raise 'Need a Elibri::ApiClient::ApiAdapters::V1::Queue instance' unless queue.kind_of? Elibri::ApiClient::ApiAdapters::V1::Queue
|
116
|
-
|
117
|
-
page_no = 1
|
118
|
-
response = get "/queues/#{queue.name}/#{queue.queue_id}"
|
119
|
-
yield response.parsed_response.css('current_page content'), page_no
|
120
|
-
while next_page = response.parsed_response.css('next_page').first
|
121
|
-
response = get next_page['url']
|
122
|
-
page_no += 1
|
123
|
-
yield response.parsed_response.css('current_page content').first, page_no
|
124
|
-
end
|
76
|
+
# Options moze przyjac {:testing => 1, :count => 100}
|
77
|
+
def pop_from_queue(queue_name, options = {})
|
78
|
+
options[:testing] = 1 if options[:testing]
|
79
|
+
options = ' ' if options.empty?
|
80
|
+
response = post "/queues/#{queue_name}/pop", :body => options
|
81
|
+
pop_xml = response.parsed_response.css('pop').first
|
82
|
+
Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(pop_xml)
|
125
83
|
end
|
126
84
|
|
127
85
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
each_page_in_queue(queue) do |products_page_xml, page_no|
|
135
|
-
products_page_xml.css('Product').each do |product_xml|
|
136
|
-
block.call(product_xml, product_no)
|
137
|
-
product_no += 1
|
138
|
-
end
|
139
|
-
end
|
86
|
+
def last_pop_from_queue(queue_name)
|
87
|
+
response = get "/queues/#{queue_name}/last_pop"
|
88
|
+
pop_xml = response.parsed_response.css('pop').first
|
89
|
+
Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(pop_xml)
|
90
|
+
rescue Exceptions::NoRecentlyPoppedData # Ignoruj bledy o braku ostatnich POPow.
|
91
|
+
return nil
|
140
92
|
end
|
141
93
|
|
142
94
|
|
@@ -164,7 +116,7 @@ module Elibri
|
|
164
116
|
|
165
117
|
private
|
166
118
|
|
167
|
-
# http://
|
119
|
+
# http://www.elibri.com.pl:80/api/v1
|
168
120
|
def full_api_uri
|
169
121
|
@host_uri + URI_PREFIX
|
170
122
|
end
|
@@ -13,10 +13,8 @@ module Elibri #:nodoc:
|
|
13
13
|
class NotFound < RuntimeError; end
|
14
14
|
class Forbidden < RuntimeError; end
|
15
15
|
class ServerError < RuntimeError; end
|
16
|
-
class NoPendingData < RuntimeError; end
|
17
|
-
class NoRecentlyPickedUpQueues < RuntimeError; end
|
18
16
|
class QueueDoesNotExists < RuntimeError; end
|
19
|
-
class
|
17
|
+
class NoRecentlyPoppedData < RuntimeError; end
|
20
18
|
end
|
21
19
|
|
22
20
|
# Klasy wyjatkow rzucanych, gdy elibri zwroci okreslony blad. Np. gdy dostaniemy:
|
@@ -29,9 +27,7 @@ module Elibri #:nodoc:
|
|
29
27
|
'403' => Exceptions::Forbidden,
|
30
28
|
'500' => Exceptions::ServerError,
|
31
29
|
'1001' => Exceptions::QueueDoesNotExists,
|
32
|
-
'1002' => Exceptions::
|
33
|
-
'1003' => Exceptions::NoRecentlyPickedUpQueues,
|
34
|
-
'1004' => Exceptions::InvalidPageNumber
|
30
|
+
'1002' => Exceptions::NoRecentlyPoppedData,
|
35
31
|
}.freeze
|
36
32
|
|
37
33
|
|
@@ -41,52 +37,36 @@ module Elibri #:nodoc:
|
|
41
37
|
attr_reader :name
|
42
38
|
# Ilosc produktow znajdujacych sie w kolejce
|
43
39
|
attr_reader :products_count
|
44
|
-
# Kiedy kolejka zostala przekonwertowana na nazwana? (otrzymala ID w bazie)
|
45
|
-
attr_reader :picked_up_at
|
46
40
|
# Kiedy ostatnio umieszczono jakis produkt w kolejce?
|
47
41
|
attr_reader :last_insert_at
|
48
|
-
# Unikalny identyfikator kolejki w bazie
|
49
|
-
attr_reader :queue_id
|
50
|
-
# Entrypoint API, pod ktorym mozna zobaczyc zawartosc kolejki
|
51
|
-
attr_reader :url
|
52
42
|
|
53
43
|
|
54
44
|
def initialize(api_adapter, attributes = {}) #:nodoc:
|
55
|
-
attributes.assert_valid_keys(:name, :products_count, :
|
45
|
+
attributes.assert_valid_keys(:name, :products_count, :last_insert_at)
|
56
46
|
@api_adapter = api_adapter
|
57
47
|
@name = attributes[:name]
|
58
48
|
@products_count = attributes[:products_count].to_i
|
59
|
-
@queue_id = attributes[:queue_id]
|
60
|
-
@url = attributes[:url]
|
61
|
-
|
62
49
|
@last_insert_at = Time.parse(attributes[:last_insert_at]) if attributes[:last_insert_at].present?
|
63
|
-
@picked_up_at = Time.parse(attributes[:picked_up_at]) if attributes[:picked_up_at].present?
|
64
50
|
end
|
65
51
|
|
66
52
|
|
67
|
-
#
|
68
|
-
|
69
|
-
|
70
|
-
#
|
71
|
-
def pick_up!
|
72
|
-
@api_adapter.pick_up_queue!(self) unless picked_up?
|
53
|
+
# Pobierz dane z kolejki
|
54
|
+
def pop(options = {})
|
55
|
+
@api_adapter.pop_from_queue(self.name, options)
|
73
56
|
end
|
74
57
|
|
75
58
|
|
76
|
-
#
|
77
|
-
def
|
78
|
-
|
79
|
-
@api_adapter.each_product_onix_in_queue(self, &block)
|
59
|
+
# Zwroc ostatnio pobrane dane z tej kolejki
|
60
|
+
def last_pop
|
61
|
+
@api_adapter.last_pop_from_queue(self.name)
|
80
62
|
end
|
81
63
|
|
82
64
|
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
def picked_up?
|
89
|
-
!self.name.start_with?('pending_')
|
65
|
+
# Iteruj po kolejnych rekordach ONIX w nazwanej kolejce.
|
66
|
+
def each_product(&block) #:yields: product_xml
|
67
|
+
while (_pop = pop).popped_products_count > 0
|
68
|
+
_pop.each_product(&block)
|
69
|
+
end
|
90
70
|
end
|
91
71
|
|
92
72
|
|
@@ -96,16 +76,53 @@ module Elibri #:nodoc:
|
|
96
76
|
Queue.new(api_adapter,
|
97
77
|
:name => queue_xml['name'],
|
98
78
|
:products_count => queue_xml['products_count'].to_i,
|
99
|
-
:last_insert_at => queue_xml['last_insert_at']
|
100
|
-
:url => queue_xml['url'],
|
101
|
-
:queue_id => queue_xml['id'],
|
102
|
-
:picked_up_at => queue_xml['picked_up_at']
|
79
|
+
:last_insert_at => queue_xml['last_insert_at']
|
103
80
|
)
|
104
81
|
end
|
105
82
|
end
|
106
83
|
|
107
84
|
|
108
85
|
|
86
|
+
class QueuePop
|
87
|
+
# Nazwa kolejki ktorej dotyczyl POP
|
88
|
+
attr_reader :queue_name
|
89
|
+
# Ilosc produktow pobranych w tym POPie
|
90
|
+
attr_reader :popped_products_count
|
91
|
+
# Kiedy POP zostal wykonany?
|
92
|
+
attr_reader :created_at
|
93
|
+
# ONIX pobranych produktow
|
94
|
+
attr_reader :products_xmls
|
95
|
+
|
96
|
+
|
97
|
+
def initialize(attributes = {}) #:nodoc:
|
98
|
+
attributes.assert_valid_keys(:queue_name, :popped_products_count, :created_at, :products_xmls)
|
99
|
+
@queue_name = attributes[:queue_name]
|
100
|
+
@popped_products_count = attributes[:popped_products_count].to_i
|
101
|
+
@products_xmls = attributes[:products_xmls]
|
102
|
+
@created_at = Time.parse(attributes[:created_at])
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def each_product(&block)
|
107
|
+
@products_xmls.each(&block)
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# Zbuduj instancje na podstawie XML`a.
|
112
|
+
def self.build_from_xml(pop_xml) #:nodoc:
|
113
|
+
pop_xml = Nokogiri::XML(pop_xml).css('pop').first if pop_xml.is_a? String
|
114
|
+
QueuePop.new(
|
115
|
+
:queue_name => pop_xml['queue_name'],
|
116
|
+
:popped_products_count => pop_xml['popped_products_count'].to_i,
|
117
|
+
:created_at => pop_xml['created_at'],
|
118
|
+
:products_xmls => pop_xml.css('Product')
|
119
|
+
)
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
|
109
126
|
class Publisher
|
110
127
|
# Identyfikator wydawnictwa w bazie
|
111
128
|
attr_reader :publisher_id
|
@@ -188,6 +205,7 @@ module Elibri #:nodoc:
|
|
188
205
|
end
|
189
206
|
|
190
207
|
|
208
|
+
|
191
209
|
class Product
|
192
210
|
# Wydawnictwo, ktore opublikowalo produkt - instancja Elibri::ApiClient::ApiAdapters::V1::Publisher
|
193
211
|
attr_reader :publisher
|
data/lib/elibri_api_client.rb
CHANGED
@@ -17,7 +17,7 @@ module Elibri
|
|
17
17
|
extend Forwardable
|
18
18
|
|
19
19
|
# Domyslny adres serwera API
|
20
|
-
DEFAULT_API_HOST_URI = 'http://
|
20
|
+
DEFAULT_API_HOST_URI = 'http://www.elibri.com.pl:80'
|
21
21
|
# Adres hosta, pod ktorym figuruje serwer API - domyslnie to DEFAULT_API_HOST_URI
|
22
22
|
attr_reader :host_uri
|
23
23
|
|
@@ -40,7 +40,7 @@ module Elibri
|
|
40
40
|
|
41
41
|
|
42
42
|
# Metody API delegujemy do odpowiedniego adaptera:
|
43
|
-
def_delegators :@api_adapter, :refill_all_queues!, :pending_data?, :pending_queues, :
|
43
|
+
def_delegators :@api_adapter, :refill_all_queues!, :pending_data?, :pending_queues, :publishers, :last_pop_from_queue
|
44
44
|
|
45
45
|
end
|
46
46
|
end
|
@@ -40,7 +40,7 @@ describe Elibri::ApiClient do
|
|
40
40
|
it "should delegate several methods to apropriate API adapter" do
|
41
41
|
client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass')
|
42
42
|
|
43
|
-
delegated_methods = %w{refill_all_queues! pending_data? pending_queues
|
43
|
+
delegated_methods = %w{refill_all_queues! pending_data? pending_queues publishers}
|
44
44
|
delegated_methods.each {|method_name| client.instance_variable_get('@api_adapter').expects(method_name) }
|
45
45
|
delegated_methods.each {|method_name| client.send(method_name) }
|
46
46
|
end
|
@@ -13,7 +13,7 @@ describe Elibri::ApiClient::ApiAdapters::V1::Product do
|
|
13
13
|
product = Elibri::ApiClient::ApiAdapters::V1::Product.new(@api_adapter, @publisher,
|
14
14
|
:record_reference => 'AAAAAAAAAAAAAAA',
|
15
15
|
:title => 'Erlang Programming',
|
16
|
-
:url => 'http://
|
16
|
+
:url => 'http://www.elibri.com.pl/api/v1/products/AAAAAAAAAAAAAAA'
|
17
17
|
)
|
18
18
|
|
19
19
|
assert_equal 'Erlang Programming', product.title
|
@@ -25,13 +25,13 @@ describe Elibri::ApiClient::ApiAdapters::V1::Product do
|
|
25
25
|
|
26
26
|
it "should be able to build itself from provided XML" do
|
27
27
|
xml = %Q{
|
28
|
-
<product record_reference="04325b31fdece145d22e" title="Erlang Programming" url="http://
|
28
|
+
<product record_reference="04325b31fdece145d22e" title="Erlang Programming" url="http://www.elibri.com.pl/api/v1/products/04325b31fdece145d22e"/>
|
29
29
|
}
|
30
30
|
|
31
31
|
product = Elibri::ApiClient::ApiAdapters::V1::Product.build_from_xml(@api_adapter, @publisher, xml)
|
32
32
|
assert_equal 'Erlang Programming', product.title
|
33
33
|
assert_equal '04325b31fdece145d22e', product.record_reference
|
34
|
-
assert_equal "http://
|
34
|
+
assert_equal "http://www.elibri.com.pl/api/v1/products/04325b31fdece145d22e", product.url
|
35
35
|
end
|
36
36
|
|
37
37
|
|
@@ -13,13 +13,13 @@ describe Elibri::ApiClient::ApiAdapters::V1::Publisher do
|
|
13
13
|
:name => 'Wydawnicta Naukowo-Techniczne',
|
14
14
|
:publisher_id => '1020',
|
15
15
|
:products_count => 1503,
|
16
|
-
:products_url => 'http://
|
16
|
+
:products_url => 'http://www.elibri.com.pl/api/v1/publishers/1020/products'
|
17
17
|
)
|
18
18
|
|
19
19
|
assert_equal 'Wydawnicta Naukowo-Techniczne', publisher.name
|
20
20
|
assert_equal 1020, publisher.publisher_id
|
21
21
|
assert_equal 1503, publisher.products_count
|
22
|
-
assert_equal 'http://
|
22
|
+
assert_equal 'http://www.elibri.com.pl/api/v1/publishers/1020/products', publisher.products_url
|
23
23
|
end
|
24
24
|
|
25
25
|
|
@@ -28,7 +28,7 @@ describe Elibri::ApiClient::ApiAdapters::V1::Publisher do
|
|
28
28
|
xml = %Q{
|
29
29
|
<publishers>
|
30
30
|
<publisher name="Wydawnicta Naukowo-Techniczne" city="Kraków" company_name="WNT Polska Sp. z o.o." zip_code="30-417" id="1" street="Łagiewnicka 33a" phone1="(12) 252-85-92" phone2="(12) 252-85-80" nip="679-284-08-64" www="http://www.wnt.com" email="sprzedaz@wnt.com">
|
31
|
-
<products url="http://
|
31
|
+
<products url="http://www.elibri.com.pl/api/v1/publishers/1/products" count="350"/>
|
32
32
|
</publisher>
|
33
33
|
</publishers>
|
34
34
|
}
|
@@ -47,7 +47,7 @@ describe Elibri::ApiClient::ApiAdapters::V1::Publisher do
|
|
47
47
|
assert_equal "679-284-08-64", publisher.nip
|
48
48
|
assert_equal "http://www.wnt.com", publisher.www
|
49
49
|
assert_equal "sprzedaz@wnt.com", publisher.email
|
50
|
-
assert_equal 'http://
|
50
|
+
assert_equal 'http://www.elibri.com.pl/api/v1/publishers/1/products', publisher.products_url
|
51
51
|
end
|
52
52
|
|
53
53
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
|
5
|
+
describe Elibri::ApiClient::ApiAdapters::V1::QueuePop do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@products_xmls = Nokogiri::XML(<<-XML).css('Product')
|
9
|
+
<root>
|
10
|
+
<Product>
|
11
|
+
<RecordReference>123</RecordReference>
|
12
|
+
</Product>
|
13
|
+
<Product>
|
14
|
+
<RecordReference>456</RecordReference>
|
15
|
+
</Product>
|
16
|
+
</root>
|
17
|
+
XML
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
it "should have several attributes" do
|
22
|
+
time = Time.now
|
23
|
+
queue_pop = Elibri::ApiClient::ApiAdapters::V1::QueuePop.new(
|
24
|
+
:queue_name => 'meta',
|
25
|
+
:popped_products_count => 120,
|
26
|
+
:created_at => time.to_s,
|
27
|
+
:products_xmls => @products_xmls
|
28
|
+
)
|
29
|
+
|
30
|
+
assert_equal 'meta', queue_pop.queue_name
|
31
|
+
assert_equal 120, queue_pop.popped_products_count
|
32
|
+
assert_equal time.to_i, queue_pop.created_at.to_i
|
33
|
+
assert_equal @products_xmls, queue_pop.products_xmls
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
it "should be able to build itself from provided XML" do
|
38
|
+
xml = <<-XML
|
39
|
+
<pop queue_name="meta" popped_products_count="1500" created_at="2011-02-05 21:02:22 UTC">
|
40
|
+
#{@products_xmls.to_s}
|
41
|
+
</pop>
|
42
|
+
XML
|
43
|
+
|
44
|
+
queue_pop = Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(xml)
|
45
|
+
assert_equal 'meta', queue_pop.queue_name
|
46
|
+
assert_equal 1500, queue_pop.popped_products_count
|
47
|
+
assert_equal Time.parse("2011-02-05 21:02:22 UTC"), queue_pop.created_at
|
48
|
+
assert_equal 2, queue_pop.products_xmls.size
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
it "should provide iterator for traversing products list" do
|
53
|
+
xml = <<-XML
|
54
|
+
<pop queue_name="meta" popped_products_count="1500" created_at="2011-02-05 21:02:22 UTC">
|
55
|
+
#{@products_xmls.to_s}
|
56
|
+
</pop>
|
57
|
+
XML
|
58
|
+
|
59
|
+
queue_pop = Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(xml)
|
60
|
+
record_references = []
|
61
|
+
queue_pop.each_product {|product_xml| record_references << product_xml.css('RecordReference').text }
|
62
|
+
assert_equal ['123', '456'], record_references
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
@@ -13,74 +13,50 @@ describe Elibri::ApiClient::ApiAdapters::V1::Queue do
|
|
13
13
|
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter,
|
14
14
|
:name => 'meta',
|
15
15
|
:products_count => 120,
|
16
|
-
:
|
17
|
-
:url => 'http://api.elibri.com.pl/api/v1/queues/meta/192f134e666df34464bcc14d0413',
|
18
|
-
:last_insert_at => time.to_s,
|
19
|
-
:picked_up_at => time.to_s
|
16
|
+
:last_insert_at => time.to_s
|
20
17
|
)
|
21
18
|
|
22
19
|
assert_equal 'meta', queue.name
|
23
20
|
assert_equal 120, queue.products_count
|
24
|
-
assert_equal '192f134e666df34464bcc14d0413', queue.queue_id
|
25
|
-
assert_equal 'http://api.elibri.com.pl/api/v1/queues/meta/192f134e666df34464bcc14d0413', queue.url
|
26
21
|
assert_equal time.to_i, queue.last_insert_at.to_i
|
27
|
-
assert_equal time.to_i, queue.picked_up_at.to_i
|
28
22
|
end
|
29
23
|
|
30
24
|
|
31
|
-
|
32
25
|
it "should be able to build itself from provided XML" do
|
33
|
-
xml = %Q{<queue name="stocks"
|
26
|
+
xml = %Q{<queue name="stocks" products_count="1500" last_insert_at="2011-02-05 21:02:22 UTC" />}
|
34
27
|
|
35
28
|
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.build_from_xml(@api_adapter, xml)
|
36
29
|
assert_equal 'stocks', queue.name
|
37
30
|
assert_equal 1500, queue.products_count
|
38
|
-
assert_equal '192f134e666df34464bcc14d04135cda2bd13a0c', queue.queue_id
|
39
|
-
assert_equal 'http://api.elibri.com.pl/api/v1/queues/stocks/192f134e666df34464bcc14d04135cda2bd13a0c', queue.url
|
40
31
|
assert_equal Time.parse("2011-02-05 21:02:22 UTC"), queue.last_insert_at
|
41
|
-
assert_equal Time.parse("2011-02-05 22:02:22 UTC"), queue.picked_up_at
|
42
|
-
|
43
|
-
xml = %Q{<queue name="pending_stocks" products_count="1500" last_insert_at="2011-02-05 21:02:22 UTC"/>}
|
44
|
-
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.build_from_xml(@api_adapter, xml)
|
45
|
-
assert_nil queue.queue_id
|
46
|
-
assert_nil queue.picked_up_at
|
47
|
-
assert_nil queue.url
|
48
32
|
end
|
49
33
|
|
50
34
|
|
51
|
-
it "should be able to
|
52
|
-
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'pending_meta')
|
53
|
-
assert !queue.picked_up?
|
54
|
-
|
35
|
+
it "should be able to pop data from itself" do
|
55
36
|
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'meta')
|
56
|
-
|
37
|
+
@api_adapter.expects(:pop_from_queue).with(queue.name, {:testing => 1, :count => 20})
|
38
|
+
queue.pop(:testing => 1, :count => 20)
|
57
39
|
end
|
58
40
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
it "should be able to pick up itself when its a pending queue" do
|
63
|
-
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'pending_meta')
|
64
|
-
@api_adapter.expects(:pick_up_queue!).with(queue)
|
65
|
-
queue.pick_up!
|
66
|
-
|
41
|
+
|
42
|
+
it "should be able to establish last pop from itself" do
|
67
43
|
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'meta')
|
68
|
-
@api_adapter.expects(:
|
69
|
-
queue.
|
44
|
+
@api_adapter.expects(:last_pop_from_queue).with('meta')
|
45
|
+
queue.last_pop
|
70
46
|
end
|
71
47
|
|
72
|
-
|
73
48
|
|
74
49
|
it "should provide iterator for traversing products list" do
|
75
|
-
block = lambda {|product_xml| product_xml.css('RecordReference') }
|
76
|
-
|
77
50
|
queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'meta')
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
|
51
|
+
pop_with_products = mock('QueuePop', :popped_products_count => 10)
|
52
|
+
pop_with_products.expects(:each_product)
|
83
53
|
|
54
|
+
pop_without_products = mock('QueuePop', :popped_products_count => 0)
|
55
|
+
pop_without_products.expects(:each_product).never
|
56
|
+
queue.expects(:pop).returns(pop_with_products).then.returns(pop_without_products).twice
|
84
57
|
|
58
|
+
queue.each_product {|product_xml| product_xml.css('RecordReference') }
|
59
|
+
end
|
60
|
+
|
85
61
|
|
86
62
|
end
|
@@ -13,10 +13,11 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
|
16
|
-
def post_request_expected(request_uri)
|
16
|
+
def post_request_expected(request_uri, options = {})
|
17
|
+
options = ' ' if options.empty?
|
17
18
|
Elibri::ApiClient::ApiAdapters::V1.expects(:post).with(
|
18
19
|
request_uri,
|
19
|
-
{:body =>
|
20
|
+
{:body => options, :digest_auth => {:username => 'login', :password => 'password'}}
|
20
21
|
)
|
21
22
|
end
|
22
23
|
|
@@ -27,7 +28,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
27
28
|
|
28
29
|
|
29
30
|
it "should define several exception classes" do
|
30
|
-
exception_classes = %w{Unauthorized NotFound Forbidden ServerError
|
31
|
+
exception_classes = %w{Unauthorized NotFound Forbidden ServerError QueueDoesNotExists NoRecentlyPoppedData}
|
31
32
|
exception_classes.each do |exception_class|
|
32
33
|
assert(Elibri::ApiClient::ApiAdapters::V1::Exceptions.const_get(exception_class) < RuntimeError)
|
33
34
|
end
|
@@ -44,11 +45,11 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
44
45
|
it "should normalise request URI before performing real request" do
|
45
46
|
response_stub = stub('response_stub', :code => 200, :parsed_response => nil)
|
46
47
|
|
47
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/192f134e666df34464bcc14d0413").once.returns(response_stub)
|
48
|
-
@adapter.send(:get, "#{FAKE_API_HOST}/api/v1/queues/meta/192f134e666df34464bcc14d0413")
|
49
|
-
|
50
48
|
get_request_expected("#{FAKE_API_HOST}/api/v1/api_entrypoint").once.returns(response_stub)
|
51
|
-
@adapter.send(:get,
|
49
|
+
@adapter.send(:get, "#{FAKE_API_HOST}/api/v1/api_entrypoint")
|
50
|
+
|
51
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/api_entrypoint?param1=value1").once.returns(response_stub)
|
52
|
+
@adapter.send(:get, '/api_entrypoint?param1=value1')
|
52
53
|
|
53
54
|
get_request_expected("#{FAKE_API_HOST}/api/v1/api_entrypoint_without_leading_slash").once.returns(response_stub)
|
54
55
|
@adapter.send(:get, 'api_entrypoint_without_leading_slash')
|
@@ -58,17 +59,17 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
58
59
|
|
59
60
|
describe "when asked to establish pending queues list" do
|
60
61
|
|
61
|
-
describe "and there is pending data awaiting for
|
62
|
+
describe "and there is pending data awaiting for pop" do
|
62
63
|
before do
|
63
64
|
xml = <<-XML
|
64
|
-
<
|
65
|
-
<queue name="
|
66
|
-
<queue name="
|
67
|
-
</
|
65
|
+
<queues>
|
66
|
+
<queue name="meta" products_count="24" last_insert_at="2011-02-05 21:02:22 UTC"/>
|
67
|
+
<queue name="stocks" products_count="1500" last_insert_at="2011-02-05 21:02:22 UTC"/>
|
68
|
+
</queues>
|
68
69
|
XML
|
69
70
|
|
70
71
|
response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
|
71
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues
|
72
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues").at_least_once.returns(response_stub)
|
72
73
|
end
|
73
74
|
|
74
75
|
|
@@ -77,14 +78,14 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
77
78
|
pending_queues = @adapter.pending_queues
|
78
79
|
assert_equal 2, pending_queues.size
|
79
80
|
|
80
|
-
|
81
|
-
|
81
|
+
meta = pending_queues.find {|queue| queue.name == 'meta' }
|
82
|
+
stocks = pending_queues.find {|queue| queue.name == 'stocks' }
|
82
83
|
|
83
|
-
assert_equal 24,
|
84
|
-
assert_kind_of Time,
|
84
|
+
assert_equal 24, meta.products_count
|
85
|
+
assert_kind_of Time, meta.last_insert_at
|
85
86
|
|
86
|
-
assert_equal 1500,
|
87
|
-
assert_kind_of Time,
|
87
|
+
assert_equal 1500, stocks.products_count
|
88
|
+
assert_kind_of Time, stocks.last_insert_at
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
@@ -92,14 +93,14 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
92
93
|
describe "and there is no pending data awaiting for pull" do
|
93
94
|
before do
|
94
95
|
xml = <<-XML
|
95
|
-
<
|
96
|
-
<queue name="
|
97
|
-
<queue name="
|
98
|
-
</
|
96
|
+
<queues>
|
97
|
+
<queue name="meta" products_count="0" />
|
98
|
+
<queue name="stocks" products_count="0" />
|
99
|
+
</queues>
|
99
100
|
XML
|
100
101
|
|
101
102
|
response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
|
102
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues
|
103
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues").at_least_once.returns(response_stub)
|
103
104
|
end
|
104
105
|
|
105
106
|
|
@@ -110,47 +111,6 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
describe "when asked to pick up queue" do
|
116
|
-
before do
|
117
|
-
xml = <<-XML
|
118
|
-
<pick_up>
|
119
|
-
<queue name="meta" id="192f134e666df34464bcc14d04135cda2bd13a0c" url="#{FAKE_API_HOST}/api/v1/queues/meta/192f134e666df34464bcc14d04135cda2bd13a0c" products_count="24" last_insert_at="2011-02-05 21:02:22 UTC" picked_up_at="2011-02-05 21:02:22 UTC"/>
|
120
|
-
</pick_up>
|
121
|
-
XML
|
122
|
-
|
123
|
-
@response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
it "should be able to pick it up by name" do
|
128
|
-
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/pending_meta/pick_up").at_least_once.returns(@response_stub)
|
129
|
-
picked_up_queue = @adapter.pick_up_queue!('pending_meta')
|
130
|
-
assert_equal 24, picked_up_queue.products_count
|
131
|
-
assert_kind_of Time, picked_up_queue.picked_up_at
|
132
|
-
end
|
133
|
-
|
134
|
-
|
135
|
-
it "should be able to pick it up by Queue instance" do
|
136
|
-
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/pending_meta/pick_up").at_least_once.returns(@response_stub)
|
137
|
-
queue_to_pick_up = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'pending_meta')
|
138
|
-
picked_up_queue = @adapter.pick_up_queue!(queue_to_pick_up)
|
139
|
-
assert_equal 24, picked_up_queue.products_count
|
140
|
-
assert_kind_of Time, picked_up_queue.picked_up_at
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
it "should raise error when cannot infer queue name from argument" do
|
145
|
-
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/pending_meta/pick_up").never
|
146
|
-
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/pending_stocks/pick_up").never
|
147
|
-
|
148
|
-
assert_raises(RuntimeError) { @adapter.pick_up_queue!(12345) }
|
149
|
-
assert_raises(RuntimeError) { @adapter.pick_up_queue!(Array.new) }
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
|
154
114
|
|
155
115
|
describe "when there was error reported" do
|
156
116
|
before do
|
@@ -160,9 +120,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
160
120
|
'403' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::Forbidden,
|
161
121
|
'500' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::ServerError,
|
162
122
|
'1001' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::QueueDoesNotExists,
|
163
|
-
'1002' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::
|
164
|
-
'1003' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::NoRecentlyPickedUpQueues,
|
165
|
-
'1004' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::InvalidPageNumber
|
123
|
+
'1002' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::NoRecentlyPoppedData,
|
166
124
|
}
|
167
125
|
end
|
168
126
|
|
@@ -170,7 +128,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
170
128
|
it "should raise proper exception class" do
|
171
129
|
@exception_classes.each do |error_code, exception_class|
|
172
130
|
response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML( @xml.gsub('ERROR_CODE', error_code) ))
|
173
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues
|
131
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues").once.returns(response_stub)
|
174
132
|
assert_raises(exception_class) { @adapter.pending_queues }
|
175
133
|
end
|
176
134
|
end
|
@@ -178,137 +136,20 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
178
136
|
|
179
137
|
it "should raise Unauthorized, when there is 401 response code" do
|
180
138
|
response_stub = stub('response_stub', :code => 401, :parsed_response => nil)
|
181
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues
|
139
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues").once.returns(response_stub)
|
182
140
|
assert_raises(Elibri::ApiClient::ApiAdapters::V1::Exceptions::Unauthorized) { @adapter.pending_queues }
|
183
141
|
end
|
184
142
|
|
185
143
|
|
186
144
|
it "should raise RuntimeError on unknown error code" do
|
187
145
|
response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML( @xml.gsub('ERROR_CODE', 'UNKNOWN_ERROR_CODE') ))
|
188
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues
|
146
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues").once.returns(response_stub)
|
189
147
|
assert_raises(Elibri::ApiClient::ApiAdapters::V1::Exceptions::UnknownError) { @adapter.pending_queues }
|
190
148
|
end
|
191
149
|
|
192
150
|
end
|
193
151
|
|
194
152
|
|
195
|
-
|
196
|
-
describe "when asked to get latest pickups" do
|
197
|
-
describe "and there is no recently picked up queues" do
|
198
|
-
before do
|
199
|
-
xml = %q{<error id='1003'> <message>There is no recently picked up queue</message> </error>}
|
200
|
-
response_stub = stub('response_stub', :code => 412, :parsed_response => Nokogiri::XML(xml))
|
201
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pick_up").once.returns(response_stub)
|
202
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/stocks/last_pick_up").once.returns(response_stub)
|
203
|
-
end
|
204
|
-
|
205
|
-
it "should return empty latest pickups list" do
|
206
|
-
assert @adapter.last_pickups.empty?
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
|
211
|
-
describe "and there were recently picked up queues" do
|
212
|
-
before do
|
213
|
-
meta_xml = <<-XML
|
214
|
-
<pick_up>
|
215
|
-
<queue name="meta" id="192f134e666df34464bcc14d04135cda2bd13a0c" url="#{FAKE_API_HOST}/api/v1/queues/meta/192f134e666df34464bcc14d04135cda2bd13a0c" products_count="24" last_insert_at="2011-02-05 21:02:22 UTC" picked_up_at="2011-02-05 21:02:22 UTC"/>
|
216
|
-
</pick_up>
|
217
|
-
XML
|
218
|
-
|
219
|
-
stocks_xml = <<-XML
|
220
|
-
<pick_up>
|
221
|
-
<queue name="stocks" id="192f134e666df34464bcc14d04135cda2bd13a0d" url="#{FAKE_API_HOST}/api/v1/queues/stocks/192f134e666df34464bcc14d04135cda2bd13a0d" products_count="50" last_insert_at="2011-02-05 21:02:22 UTC" picked_up_at="2011-02-05 21:02:22 UTC"/>
|
222
|
-
</pick_up>
|
223
|
-
XML
|
224
|
-
|
225
|
-
meta_response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(meta_xml))
|
226
|
-
stocks_response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(stocks_xml))
|
227
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pick_up").once.returns(meta_response_stub)
|
228
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/stocks/last_pick_up").once.returns(stocks_response_stub)
|
229
|
-
end
|
230
|
-
|
231
|
-
|
232
|
-
it "should return latest pickups as Queue instances" do
|
233
|
-
last_pickups = @adapter.last_pickups
|
234
|
-
assert_equal 2, last_pickups.size
|
235
|
-
assert(last_pickups.all? { |pickup| pickup.is_a? Elibri::ApiClient::ApiAdapters::V1::Queue })
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
describe "when asked to iterate by products in a queue" do
|
243
|
-
before do
|
244
|
-
@queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@adapter, :name => 'meta', :queue_id => 'QUEUE_ID')
|
245
|
-
first_page_xml = <<-XML
|
246
|
-
<queue name="meta" id="QUEUE_ID" products_count="54" picked_up_at="2011-02-05 21:02:22 UTC">
|
247
|
-
<items paginated="true">
|
248
|
-
<pages total="3" items_per_page="20" >
|
249
|
-
<next_page page_no="2" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/2" />
|
250
|
-
<current_page page_no="1" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID" >
|
251
|
-
<content><Product>PRODUCT_FROM_PAGE_1</Product></content>
|
252
|
-
</current_page>
|
253
|
-
</pages>
|
254
|
-
</items>
|
255
|
-
</queue>
|
256
|
-
XML
|
257
|
-
second_page_xml = <<-XML
|
258
|
-
<queue name="meta" id="QUEUE_ID" products_count="54" picked_up_at="2011-02-05 21:02:22 UTC">
|
259
|
-
<items paginated="true">
|
260
|
-
<pages total="3" items_per_page="20" >
|
261
|
-
<previous_page page_no="1" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID" />
|
262
|
-
<next_page page_no="3" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/3" />
|
263
|
-
<current_page page_no="2" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/2" >
|
264
|
-
<content><Product>PRODUCT_FROM_PAGE_2</Product></content>
|
265
|
-
</current_page>
|
266
|
-
</pages>
|
267
|
-
</items>
|
268
|
-
</queue>
|
269
|
-
XML
|
270
|
-
third_page_xml = <<-XML
|
271
|
-
<queue name="meta" id="QUEUE_ID" products_count="54" picked_up_at="2011-02-05 21:02:22 UTC">
|
272
|
-
<items paginated="true">
|
273
|
-
<pages total="3" items_per_page="20" >
|
274
|
-
<previous_page page_no="2" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/2" />
|
275
|
-
<current_page page_no="3" url="#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/3" >
|
276
|
-
<content><Product>PRODUCT_FROM_PAGE_3</Product></content>
|
277
|
-
</current_page>
|
278
|
-
</pages>
|
279
|
-
</items>
|
280
|
-
</queue>
|
281
|
-
XML
|
282
|
-
|
283
|
-
first_page_response_stub = stub('response1_stub', :code => 200, :parsed_response => Nokogiri::XML(first_page_xml))
|
284
|
-
second_page_response_stub = stub('response2_stub', :code => 200, :parsed_response => Nokogiri::XML(second_page_xml))
|
285
|
-
third_page_response_stub = stub('response3_stub', :code => 200, :parsed_response => Nokogiri::XML(third_page_xml))
|
286
|
-
|
287
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID").once.returns(first_page_response_stub)
|
288
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/2").once.returns(second_page_response_stub)
|
289
|
-
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/QUEUE_ID/3").once.returns(third_page_response_stub)
|
290
|
-
end
|
291
|
-
|
292
|
-
|
293
|
-
it "should be able to iterate through products pages" do
|
294
|
-
expected_content = %w{<Product>PRODUCT_FROM_PAGE_1</Product> <Product>PRODUCT_FROM_PAGE_2</Product> <Product>PRODUCT_FROM_PAGE_3</Product>}
|
295
|
-
@adapter.each_page_in_queue(@queue) do |page_content, page_no|
|
296
|
-
assert_equal expected_content[page_no-1], page_content.children.to_s
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
|
301
|
-
it "should be able to iterate through all product records" do
|
302
|
-
expected_records = %w{PRODUCT_FROM_PAGE_1 PRODUCT_FROM_PAGE_2 PRODUCT_FROM_PAGE_3}
|
303
|
-
@adapter.each_product_onix_in_queue(@queue) do |product_xml, product_no|
|
304
|
-
assert_kind_of Nokogiri::XML::Element, product_xml
|
305
|
-
assert_equal expected_records[product_no-1], product_xml.text
|
306
|
-
end
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
|
311
|
-
|
312
153
|
describe "when asked to establish available publishers list" do
|
313
154
|
before do
|
314
155
|
xml = <<-XML
|
@@ -390,4 +231,109 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
|
|
390
231
|
end
|
391
232
|
|
392
233
|
end
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
describe "when asked to pop data from specified queue name" do
|
238
|
+
|
239
|
+
before do
|
240
|
+
xml = <<-XML
|
241
|
+
<pop created_at="2011-09-06 13:58:21 UTC" queue_name="meta" popped_products_count="2">
|
242
|
+
<ONIXMessage release="3.0">
|
243
|
+
<Header>
|
244
|
+
<Sender>
|
245
|
+
<SenderName>Elibri.com.pl</SenderName>
|
246
|
+
<ContactName>Tomasz Meka</ContactName>
|
247
|
+
<EmailAddress>kontakt@elibri.com.pl</EmailAddress>
|
248
|
+
</Sender>
|
249
|
+
<SentDateTime>20110906</SentDateTime>
|
250
|
+
</Header>
|
251
|
+
|
252
|
+
<Product>
|
253
|
+
</Product>
|
254
|
+
<Product>
|
255
|
+
</Product>
|
256
|
+
</ONIXMessage>
|
257
|
+
</pop>
|
258
|
+
XML
|
259
|
+
|
260
|
+
@response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
|
261
|
+
end
|
262
|
+
|
263
|
+
|
264
|
+
it "should send params when they are specified and return QueuePop instance" do
|
265
|
+
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/pop", :testing => 1, :count => 5).at_least_once.returns(@response_stub)
|
266
|
+
|
267
|
+
pop = @adapter.pop_from_queue('meta', :testing => true, :count => 5)
|
268
|
+
assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
|
269
|
+
assert_equal 2, pop.popped_products_count
|
270
|
+
end
|
271
|
+
|
272
|
+
|
273
|
+
it "should send empty request body when no params are specified" do
|
274
|
+
post_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/pop").at_least_once.returns(@response_stub)
|
275
|
+
|
276
|
+
pop = @adapter.pop_from_queue('meta')
|
277
|
+
assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
|
278
|
+
assert_equal 2, pop.popped_products_count
|
279
|
+
end
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
|
284
|
+
describe "when asked to get last pop for specified queue name" do
|
285
|
+
|
286
|
+
describe "and there was no recent pop" do
|
287
|
+
before do
|
288
|
+
xml = %q{<error id='1002'> <message>There is no recently popped data</message> </error>}
|
289
|
+
response_stub = stub('response_stub', :code => 412, :parsed_response => Nokogiri::XML(xml))
|
290
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop").once.returns(response_stub)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should return nil, ignoring NoRecentlyPoppedData exception" do
|
294
|
+
assert_nil @adapter.last_pop_from_queue('meta')
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
|
299
|
+
describe "and there was a pop" do
|
300
|
+
|
301
|
+
before do
|
302
|
+
xml = <<-XML
|
303
|
+
<pop created_at="2011-09-06 13:58:21 UTC" queue_name="meta" popped_products_count="2">
|
304
|
+
<ONIXMessage release="3.0">
|
305
|
+
<Header>
|
306
|
+
<Sender>
|
307
|
+
<SenderName>Elibri.com.pl</SenderName>
|
308
|
+
<ContactName>Tomasz Meka</ContactName>
|
309
|
+
<EmailAddress>kontakt@elibri.com.pl</EmailAddress>
|
310
|
+
</Sender>
|
311
|
+
<SentDateTime>20110906</SentDateTime>
|
312
|
+
</Header>
|
313
|
+
|
314
|
+
<Product>
|
315
|
+
</Product>
|
316
|
+
<Product>
|
317
|
+
</Product>
|
318
|
+
</ONIXMessage>
|
319
|
+
</pop>
|
320
|
+
XML
|
321
|
+
|
322
|
+
@response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
|
323
|
+
end
|
324
|
+
|
325
|
+
|
326
|
+
it "should return QueuePop instance" do
|
327
|
+
get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop").at_least_once.returns(@response_stub)
|
328
|
+
|
329
|
+
pop = @adapter.last_pop_from_queue('meta')
|
330
|
+
assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
|
331
|
+
assert_equal 2, pop.popped_products_count
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
|
336
|
+
end
|
337
|
+
|
338
|
+
|
393
339
|
end
|
data/test/helper.rb
CHANGED
@@ -10,8 +10,7 @@ end
|
|
10
10
|
require 'test/unit'
|
11
11
|
require 'minitest/autorun'
|
12
12
|
require 'mocha'
|
13
|
-
require '
|
14
|
-
Debugger.settings[:autoeval] = true rescue nil
|
13
|
+
require 'pry'
|
15
14
|
|
16
15
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
17
16
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elibri_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.5
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Marcin Urba\xC5\x84ski"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-09-30 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,7 @@ dependencies:
|
|
79
79
|
segments:
|
80
80
|
- 0
|
81
81
|
version: "0"
|
82
|
-
name:
|
82
|
+
name: pry
|
83
83
|
version_requirements: *id004
|
84
84
|
prerelease: false
|
85
85
|
- !ruby/object:Gem::Dependency
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- test/elibri_api_client_test.rb
|
183
183
|
- test/elibri_api_v1_adapter_product_test.rb
|
184
184
|
- test/elibri_api_v1_adapter_publisher_test.rb
|
185
|
+
- test/elibri_api_v1_adapter_queue_pop_test.rb
|
185
186
|
- test/elibri_api_v1_adapter_queue_test.rb
|
186
187
|
- test/elibri_api_v1_adapter_test.rb
|
187
188
|
- test/helper.rb
|