affilinet 0.0.1 → 0.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/README.md +54 -2
  4. data/lib/affilinet.rb +6 -0
  5. data/lib/affilinet/category.rb +6 -0
  6. data/lib/affilinet/client.rb +10 -39
  7. data/lib/affilinet/fluent_interface.rb +62 -0
  8. data/lib/affilinet/middleware/mash.rb +24 -2
  9. data/lib/affilinet/product.rb +6 -0
  10. data/lib/affilinet/property.rb +6 -0
  11. data/lib/affilinet/search.rb +16 -0
  12. data/lib/affilinet/shop.rb +6 -0
  13. data/lib/affilinet/version.rb +1 -1
  14. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/returns_a_Affilinet_Middleware_Mash.yml +2 -2
  15. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_products/returns_a_Affilinet_Middleware_Mash.yml +14 -10
  16. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_properties/returns_a_Affilinet_Middleware_Mash.yml +11 -7
  17. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_search/returns_a_Affilinet_Middleware_Mash.yml +34 -30
  18. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_shops/returns_a_Affilinet_Middleware_Mash.yml +10 -14
  19. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Faraday_Error_ParsingError_on_wrong_API_requests.yml +12 -8
  20. data/spec/lib/affilinet/category_spec.rb +12 -0
  21. data/spec/lib/affilinet/client_spec.rb +65 -0
  22. data/spec/lib/affilinet/middleware/mash.rb +31 -0
  23. data/spec/lib/affilinet/product_spec.rb +19 -0
  24. data/spec/lib/affilinet/property_spec.rb +12 -0
  25. data/spec/lib/affilinet/search_spec.rb +12 -0
  26. data/spec/lib/affilinet/shop_spec.rb +63 -0
  27. metadata +23 -10
  28. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/performs_the_GET_request_to_the_correct_endpoint.yml +0 -46
  29. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/categories/performs_the_GET_request_to_the_correct_endpoint.yml +0 -50
  30. data/spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Error_on_wrong_API_requests.yml +0 -37
  31. data/spec/lib/client_spec.rb +0 -98
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 184b9f6e9ad36532cd5abab5f241b73d3abb53a3
4
- data.tar.gz: 6569fcf2500822f1a95f31ea80aad136f195a7cc
3
+ metadata.gz: c7046a31b5e99b7642286a9dbbb0c55f3575aa7a
4
+ data.tar.gz: dfcd4458b152850d17edd06fd9530c6fa597e9ca
5
5
  SHA512:
6
- metadata.gz: 5a540928d05222bf9224cc3b4fda501a72a2f6c8a4f1a2ed4a8fb0b3365a2f6362857c4f65fc97b52ad9b9f8f0bfd61f898c7462f3d6a15b470330fbed16af86
7
- data.tar.gz: b34089aede717a660c1b01769e4b5ccaabed5ae6d29cb1964a516331bceaa1637a57ed2eedf174216ef10aedf0d97160dd913e81613f75573a87c773c1fd2cdc
6
+ metadata.gz: 2bdb7204a9ed7dc55f59fe4abada90b64bbef31dfa60a7d3d901f87e98d1a309755be4b055949805fb5609f2af6786eeaa7631dac3c4fc97f4bc307e30edfc4d
7
+ data.tar.gz: 785a715cb561e45d1ccc799c45633527e7049386e9a0761b3568a80398cf453844e9db2cf8adce2830489819905d99f9fc50779a9b4bf790d931151b438fc049
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Affilinet
2
2
 
3
- TODO: Write a gem description
3
+ Alpha version of a gem to access the [Affilinet](http://affili.net) JSON API.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,59 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ Examples replicating the instructions on the [API Description](http://developer.affili.net/desktopdefault.aspx/tabid-110/178_read-845)
22
+
23
+ ### Basic setup
24
+
25
+ ````ruby
26
+ require 'affilinet'
27
+
28
+ client = Affilinet::Client.new publisher_id: 580442, password: '1TuKEGkOJJ24dN07ByOy'
29
+ ````
30
+
31
+ ### Search products
32
+
33
+ ````ruby
34
+ result = client.search.query('jeans').all
35
+
36
+ # > result.products.first.brand
37
+ # => "Meat of the Room"
38
+ ````
39
+
40
+ ### Get Products
41
+
42
+ ````ruby
43
+ result = client.products.product_ids([580858761,580858759]).all
44
+
45
+ # > result.products.first.price_information.display_price
46
+ # => "starting from 90.99 GBP "
47
+ ````
48
+ ### Get Shop List
49
+
50
+ ````ruby
51
+ result = client.shops.all
52
+
53
+ # > result.shops.first.shop_title
54
+ # => "affilinet ShowCase"
55
+ ````
56
+
57
+ ### Get Category List
58
+
59
+ ````ruby
60
+ result = client.categories.shop_id(0).all
61
+
62
+ # > result.categories.first.title
63
+ # => "Clothes & Accessories "
64
+ ````
65
+
66
+ ### Get Property List
67
+
68
+ ````ruby
69
+ result = client.properties.shop_id(1748).all
70
+
71
+ # result.property_counts.first.property_name
72
+ # => "Colour"
73
+ ````
22
74
 
23
75
  ## Contributing
24
76
 
@@ -5,7 +5,13 @@ require "affilinet/version"
5
5
  require "affilinet/middleware/mash"
6
6
  require "affilinet/middleware/mashify"
7
7
  require "affilinet/middleware/parse_json"
8
+ require "affilinet/fluent_interface"
8
9
  require "affilinet/client"
10
+ require "affilinet/shop"
11
+ require "affilinet/product"
12
+ require "affilinet/search"
13
+ require "affilinet/category"
14
+ require "affilinet/property"
9
15
 
10
16
  module Affilinet
11
17
  end
@@ -0,0 +1,6 @@
1
+ module Affilinet
2
+ class Category < Affilinet::FluentInterfaceBase
3
+ add_attribute :shop_id
4
+ set_endpoint 'GetCategoryList'
5
+ end
6
+ end
@@ -34,53 +34,24 @@ module Affilinet
34
34
  connection.get(endpoint, args).body
35
35
  end
36
36
 
37
- def categories id=0
38
- get 'GetCategoryList', 'ShopId' => id
37
+ def categories
38
+ Affilinet::Category.new self
39
39
  end
40
40
 
41
- def properties id
42
- get 'GetPropertyList', 'ShopId' => id
41
+ def properties
42
+ Affilinet::Property.new self
43
43
  end
44
44
 
45
- def shops args = {}
46
- options = @options.merge args
47
- get 'GetShopList',
48
- 'LogoScale' => options[:logo_scale],
49
- 'CurrentPage' => options[:page],
50
- 'PageSize' => options[:page_size],
51
- 'Query' => options[:query],
52
- 'UpdatedAfter' => options[:updated_after]
45
+ def products
46
+ Affilinet::Product.new self
53
47
  end
54
48
 
55
- def products ids = [], args = {}
56
- options = @options.merge args
57
- get 'GetProducts',
58
- 'ProductIds' => ids.take(50).join(','),
59
- 'ImageScales' => options[:image_scales].join(','),
60
- 'LogoScales' => options[:logo_scales].join(',')
49
+ def shops
50
+ Affilinet::Shop.new self
61
51
  end
62
52
 
63
- def search args = {}
64
- options = @options.merge args
65
- get 'SearchProducts',
66
- 'ShopIds' => options[:shop_ids].join(','),
67
- 'ShopIdMode' => options[:shop_id_exclude] ? 'Exclude' : 'Include',
68
- 'Query' => options[:query],
69
- 'CategoryIds' => options[:category_ids].join(','),
70
- 'UseAffilinetCategories' => options[:affilinet_categories],
71
- 'ExcludeSubCategories' => options[:categories_exclude],
72
- 'WithImageOnly' => options[:image_only],
73
- 'ImageScales' => options[:image_scales].join(','),
74
- 'LogoScales' => options[:logo_scales].join(','),
75
- 'CurrentPage' => options[:page],
76
- 'PageSize' => options[:page_size],
77
- 'MinimumPrice' => options[:price_min],
78
- 'MaximumPrice' => options[:price_max],
79
- 'SortBy' => options[:sort_by],
80
- 'SortOrder' => options[:sort_asc] ? 'ascending' : 'descending',
81
- 'FacetFields' => options[:facets].take(4).join(','),
82
- 'FacetValueLimit' => options[:facet_limit],
83
- 'FQ' => options[:filter_query]
53
+ def search
54
+ Affilinet::Search.new self
84
55
  end
85
56
  end
86
57
  end
@@ -0,0 +1,62 @@
1
+ module Affilinet
2
+ module FluentInterface
3
+ module ClassMethods
4
+ def add_attributes(attributes)
5
+ attributes.each do |attr|
6
+ add_attribute attr
7
+ end
8
+ end
9
+
10
+ def add_attribute(attr)
11
+ define_method attr do |value|
12
+ spawn.send("#{attr}!", value)
13
+ end
14
+
15
+ define_method "#{attr}!" do |value|
16
+ @criteria[attr] = value
17
+ self
18
+ end
19
+ end
20
+
21
+ def set_endpoint endpoint
22
+ define_method :endpoint do
23
+ endpoint
24
+ end
25
+ end
26
+ end
27
+
28
+ module InstanceMethods
29
+ end
30
+ end
31
+
32
+ class FluentInterfaceBase
33
+ extend Affilinet::FluentInterface::ClassMethods
34
+ include Affilinet::FluentInterface::InstanceMethods
35
+ attr_accessor :criteria, :client, :endpoint
36
+
37
+ def initialize(client)
38
+ @client = client
39
+ @criteria = {}
40
+ end
41
+
42
+ def all
43
+ @client.get endpoint, to_query
44
+ end
45
+
46
+ def first
47
+ if (@criteria[:current_page] && @criteria[:page_size])
48
+ new_current_page = (@criteria[:current_page] - 1) * @criteria[:page_size] + 1
49
+ return current_page(new_current_page).page_size(1).all
50
+ end
51
+ all
52
+ end
53
+
54
+ def spawn
55
+ clone
56
+ end
57
+
58
+ def to_query
59
+ Affilinet::Middleware::Mash.join_arrays Affilinet::Middleware::Mash.camelize_keys @criteria
60
+ end
61
+ end
62
+ end
@@ -1,7 +1,29 @@
1
1
  module Affilinet
2
2
  module Middleware
3
3
  class Mash < Hashie::Mash
4
- def underscore(camel_cased_word)
4
+ def self.join_arrays(hash)
5
+ hash.each_pair do |key,value|
6
+ hash[key] = value.join(',') if value.is_a? Array
7
+ end
8
+ hash
9
+ end
10
+
11
+ def self.camelize_keys(hash)
12
+ hash.keys.each do |key|
13
+ hash[self.camelize(key)] = hash.delete key
14
+ end
15
+ hash
16
+ end
17
+
18
+ def self.camelize(term)
19
+ string = term.to_s
20
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
21
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
22
+ string.gsub!('/', '::')
23
+ string
24
+ end
25
+
26
+ def self.underscore(camel_cased_word)
5
27
  word = camel_cased_word.to_s.dup
6
28
  word.gsub!('::', '/')
7
29
  word.gsub!(/(?:([A-Za-z\d])|^)(#{/(?=a)b/})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
@@ -14,7 +36,7 @@ module Affilinet
14
36
 
15
37
  protected
16
38
  def convert_key(key)
17
- underscore key.to_s
39
+ Affilinet::Middleware::Mash.underscore key.to_s
18
40
  end
19
41
  end
20
42
  end
@@ -0,0 +1,6 @@
1
+ module Affilinet
2
+ class Product < Affilinet::FluentInterfaceBase
3
+ add_attributes [:product_ids, :image_scales, :logo_scales]
4
+ set_endpoint 'GetProducts'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Affilinet
2
+ class Property < Affilinet::FluentInterfaceBase
3
+ add_attribute :shop_id
4
+ set_endpoint 'GetPropertyList'
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module Affilinet
2
+ class Search < Affilinet::FluentInterfaceBase
3
+ add_attributes [:shop_ids, :shop_id_mode, :query, :category_ids, :f_q,
4
+ :use_affilinet_categories, :exclude_sub_categories,
5
+ :with_image_only, :image_scales, :logo_scales, :sort_by,
6
+ :current_page, :page_size, :minimum_price, :maximum_price,
7
+ :sort_order, :facet_fields, :facet_value_limit]
8
+ set_endpoint 'SearchProducts'
9
+
10
+ def to_query
11
+ query = @criteria.delete :query
12
+ @criteria = Affilinet::Middleware::Mash.join_arrays Affilinet::Middleware::Mash.camelize_keys @criteria
13
+ @criteria.merge({'query' => query})
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ module Affilinet
2
+ class Shop < Affilinet::FluentInterfaceBase
3
+ add_attributes [:logo_scale, :current_page, :page_size, :updated_after, :query]
4
+ set_endpoint 'GetShopList'
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Affilinet
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -19,7 +19,7 @@ http_interactions:
19
19
  message: OK
20
20
  headers:
21
21
  Date:
22
- - Sat, 15 Feb 2014 17:59:35 GMT
22
+ - Sun, 23 Feb 2014 16:02:59 GMT
23
23
  Server:
24
24
  - Microsoft-IIS/6.0
25
25
  X-Powered-By:
@@ -46,5 +46,5 @@ http_interactions:
46
46
  ICJDbG90aGVzICYgQWNjZXNzb3JpZXMgIiwNCiAgICAgICJQcm9kdWN0Q291
47
47
  bnQiOiAzMTMNCiAgICB9DQogIF0NCn0=
48
48
  http_version:
49
- recorded_at: Sat, 15 Feb 2014 17:59:35 GMT
49
+ recorded_at: Sun, 23 Feb 2014 16:02:59 GMT
50
50
  recorded_with: VCR 2.8.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetProducts?ImageScales=&LogoScales=&Password=1TuKEGkOJJ24dN07ByOy&ProductIds=580858761,580858759&publisherId=580442
5
+ uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetProducts?Password=1TuKEGkOJJ24dN07ByOy&ProductIds=580858761,580858759&publisherId=580442
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -18,16 +18,20 @@ http_interactions:
18
18
  code: 200
19
19
  message: OK
20
20
  headers:
21
+ Date:
22
+ - Sun, 23 Feb 2014 16:02:59 GMT
23
+ Server:
24
+ - Microsoft-IIS/6.0
25
+ X-Powered-By:
26
+ - ASP.NET
27
+ X-Aspnet-Version:
28
+ - 4.0.30319
21
29
  Content-Length:
22
30
  - '5372'
31
+ Cache-Control:
32
+ - private
23
33
  Content-Type:
24
34
  - application/json
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 18:02:54 GMT
31
35
  body:
32
36
  encoding: ASCII-8BIT
33
37
  string: !binary |-
@@ -35,7 +39,7 @@ http_interactions:
35
39
  MiwNCiAgICAiVG90YWxSZWNvcmRzIjogMiwNCiAgICAiVG90YWxQYWdlcyI6
36
40
  IDEsDQogICAgIkN1cnJlbnRQYWdlIjogMQ0KICB9LA0KICAiUHJvZHVjdHMi
37
41
  OiBbDQogICAgew0KICAgICAgIkxhc3RTaG9wVXBkYXRlIjogIlwvRGF0ZSgx
38
- MzkyNDA0ODIwMDAwKzAxMDApXC8iLA0KICAgICAgIkxhc3RQcm9kdWN0Q2hh
42
+ MzkzMDk2NjgwMDAwKzAxMDApXC8iLA0KICAgICAgIkxhc3RQcm9kdWN0Q2hh
39
43
  bmdlIjogIlwvRGF0ZSgxMzgyNDMyNDAwMDAwKzAyMDApXC8iLA0KICAgICAg
40
44
  IlNjb3JlIjogMC4wLA0KICAgICAgIlByb2R1Y3RJZCI6IDU4MDg1ODc1OSwN
41
45
  CiAgICAgICJBcnRpY2xlTnVtYmVyIjogIkFCQ0RfMDAwMTY1IiwNCiAgICAg
@@ -93,7 +97,7 @@ http_interactions:
93
97
  ICAgIlNob3BDYXRlZ29yeUlkUGF0aCI6ICIzNDc1ODc1NCA+IDM0NzU4Nzc4
94
98
  ID4gMzQ3NTg3ODEiLA0KICAgICAgIkFmZmlsaW5ldENhdGVnb3J5SWRQYXRo
95
99
  IjogIjE0Ig0KICAgIH0sDQogICAgew0KICAgICAgIkxhc3RTaG9wVXBkYXRl
96
- IjogIlwvRGF0ZSgxMzkyNDA0ODIwMDAwKzAxMDApXC8iLA0KICAgICAgIkxh
100
+ IjogIlwvRGF0ZSgxMzkzMDk2NjgwMDAwKzAxMDApXC8iLA0KICAgICAgIkxh
97
101
  c3RQcm9kdWN0Q2hhbmdlIjogIlwvRGF0ZSgxMzgyNDMyNDAwMDAwKzAyMDAp
98
102
  XC8iLA0KICAgICAgIlNjb3JlIjogMC4wLA0KICAgICAgIlByb2R1Y3RJZCI6
99
103
  IDU4MDg1ODc2MSwNCiAgICAgICJBcnRpY2xlTnVtYmVyIjogIkFCQ0RfMDAw
@@ -152,5 +156,5 @@ http_interactions:
152
156
  NzU4NzgxIiwNCiAgICAgICJBZmZpbGluZXRDYXRlZ29yeUlkUGF0aCI6ICIx
153
157
  NCINCiAgICB9DQogIF0NCn0=
154
158
  http_version:
155
- recorded_at: Sat, 15 Feb 2014 18:02:54 GMT
159
+ recorded_at: Sun, 23 Feb 2014 16:03:00 GMT
156
160
  recorded_with: VCR 2.8.0
@@ -18,16 +18,20 @@ http_interactions:
18
18
  code: 200
19
19
  message: OK
20
20
  headers:
21
+ Date:
22
+ - Sun, 23 Feb 2014 16:02:58 GMT
23
+ Server:
24
+ - Microsoft-IIS/6.0
25
+ X-Powered-By:
26
+ - ASP.NET
27
+ X-Aspnet-Version:
28
+ - 4.0.30319
21
29
  Content-Length:
22
30
  - '410'
31
+ Cache-Control:
32
+ - private
23
33
  Content-Type:
24
34
  - application/json
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 18:00:48 GMT
31
35
  body:
32
36
  encoding: ASCII-8BIT
33
37
  string: !binary |-
@@ -42,5 +46,5 @@ http_interactions:
42
46
  ICJPcmlnaW4iLA0KICAgICAgIlRvdGFsQ291bnQiOiAzMTMNCiAgICB9DQog
43
47
  IF0NCn0=
44
48
  http_version:
45
- recorded_at: Sat, 15 Feb 2014 18:00:48 GMT
49
+ recorded_at: Sun, 23 Feb 2014 16:02:59 GMT
46
50
  recorded_with: VCR 2.8.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/SearchProducts?CategoryIds=&CurrentPage&ExcludeSubCategories&FQ&FacetFields=&FacetValueLimit&ImageScales=&LogoScales=&MaximumPrice&MinimumPrice&PageSize&Password=1TuKEGkOJJ24dN07ByOy&Query=jeans&ShopIdMode=Include&ShopIds=&SortBy&SortOrder=descending&UseAffilinetCategories&WithImageOnly&publisherId=580442
5
+ uri: https://product-api.affili.net/V3/productservice.svc/JSON/SearchProducts?Password=1TuKEGkOJJ24dN07ByOy&publisherId=580442&query=jeans
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -18,16 +18,20 @@ http_interactions:
18
18
  code: 200
19
19
  message: OK
20
20
  headers:
21
+ Date:
22
+ - Sun, 23 Feb 2014 16:03:00 GMT
23
+ Server:
24
+ - Microsoft-IIS/6.0
25
+ X-Powered-By:
26
+ - ASP.NET
27
+ X-Aspnet-Version:
28
+ - 4.0.30319
21
29
  Content-Length:
22
30
  - '26570'
31
+ Cache-Control:
32
+ - private
23
33
  Content-Type:
24
34
  - application/json
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 18:03:48 GMT
31
35
  body:
32
36
  encoding: ASCII-8BIT
33
37
  string: !binary |-
@@ -35,9 +39,9 @@ http_interactions:
35
39
  MTAsDQogICAgIlRvdGFsUmVjb3JkcyI6IDQzLA0KICAgICJUb3RhbFBhZ2Vz
36
40
  IjogNSwNCiAgICAiQ3VycmVudFBhZ2UiOiAxDQogIH0sDQogICJQcm9kdWN0
37
41
  cyI6IFsNCiAgICB7DQogICAgICAiTGFzdFNob3BVcGRhdGUiOiAiXC9EYXRl
38
- KDEzOTI0MDQ4MjAwMDArMDEwMClcLyIsDQogICAgICAiTGFzdFByb2R1Y3RD
42
+ KDEzOTMwOTY2ODAwMDArMDEwMClcLyIsDQogICAgICAiTGFzdFByb2R1Y3RD
39
43
  aGFuZ2UiOiAiXC9EYXRlKDEzODI0MzI0MDAwMDArMDIwMClcLyIsDQogICAg
40
- ICAiU2NvcmUiOiAxLjI2NjE5OTUsDQogICAgICAiUHJvZHVjdElkIjogNTgw
44
+ ICAiU2NvcmUiOiAxLjI3MDMwOTQsDQogICAgICAiUHJvZHVjdElkIjogNTgw
41
45
  ODU4NzY2LA0KICAgICAgIkFydGljbGVOdW1iZXIiOiAiQUJDRF8wMDAxNzIi
42
46
  LA0KICAgICAgIlNob3BJZCI6IDE3NDgsDQogICAgICAiU2hvcFRpdGxlIjog
43
47
  ImFmZmlsaW5ldCBTaG93Q2FzZSIsDQogICAgICAiUHJvZHVjdE5hbWUiOiAi
@@ -94,9 +98,9 @@ http_interactions:
94
98
  cnlJZFBhdGgiOiAiMzQ3NTg3NTQgPiAzNDc1ODc3OCA+IDM0NzU4NzgxIiwN
95
99
  CiAgICAgICJBZmZpbGluZXRDYXRlZ29yeUlkUGF0aCI6ICIxNCINCiAgICB9
96
100
  LA0KICAgIHsNCiAgICAgICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5
97
- MjQwNDgyMDAwMCswMTAwKVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENoYW5n
101
+ MzA5NjY4MDAwMCswMTAwKVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENoYW5n
98
102
  ZSI6ICJcL0RhdGUoMTM4MjQzMjQwMDAwMCswMjAwKVwvIiwNCiAgICAgICJT
99
- Y29yZSI6IDEuMjY2MTk5NSwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg3
103
+ Y29yZSI6IDEuMjcwMzA5NCwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg3
100
104
  NDksDQogICAgICAiQXJ0aWNsZU51bWJlciI6ICJBQkNEXzAwMDE1NSIsDQog
101
105
  ICAgICAiU2hvcElkIjogMTc0OCwNCiAgICAgICJTaG9wVGl0bGUiOiAiYWZm
102
106
  aWxpbmV0IFNob3dDYXNlIiwNCiAgICAgICJQcm9kdWN0TmFtZSI6ICJKZWFu
@@ -151,10 +155,10 @@ http_interactions:
151
155
  CiAgICAgICJQcm9ncmFtSWQiOiA4OTkxLA0KICAgICAgIlNob3BDYXRlZ29y
152
156
  eUlkUGF0aCI6ICIzNDc1ODc1NCA+IDM0NzU4Nzc4ID4gMzQ3NTg3ODEiLA0K
153
157
  ICAgICAgIkFmZmlsaW5ldENhdGVnb3J5SWRQYXRoIjogIjE0Ig0KICAgIH0s
154
- DQogICAgew0KICAgICAgIkxhc3RTaG9wVXBkYXRlIjogIlwvRGF0ZSgxMzky
155
- NDA0ODIwMDAwKzAxMDApXC8iLA0KICAgICAgIkxhc3RQcm9kdWN0Q2hhbmdl
158
+ DQogICAgew0KICAgICAgIkxhc3RTaG9wVXBkYXRlIjogIlwvRGF0ZSgxMzkz
159
+ MDk2NjgwMDAwKzAxMDApXC8iLA0KICAgICAgIkxhc3RQcm9kdWN0Q2hhbmdl
156
160
  IjogIlwvRGF0ZSgxMzgyNDMyNDAwMDAwKzAyMDApXC8iLA0KICAgICAgIlNj
157
- b3JlIjogMS4yNjYxOTk1LA0KICAgICAgIlByb2R1Y3RJZCI6IDU4MDg1ODc1
161
+ b3JlIjogMS4yNzAzMDk0LA0KICAgICAgIlByb2R1Y3RJZCI6IDU4MDg1ODc1
158
162
  NSwNCiAgICAgICJBcnRpY2xlTnVtYmVyIjogIkFCQ0RfMDAwMTYxIiwNCiAg
159
163
  ICAgICJTaG9wSWQiOiAxNzQ4LA0KICAgICAgIlNob3BUaXRsZSI6ICJhZmZp
160
164
  bGluZXQgU2hvd0Nhc2UiLA0KICAgICAgIlByb2R1Y3ROYW1lIjogIkplYW5z
@@ -211,9 +215,9 @@ http_interactions:
211
215
  ODk5MSwNCiAgICAgICJTaG9wQ2F0ZWdvcnlJZFBhdGgiOiAiMzQ3NTg3NTQg
212
216
  PiAzNDc1ODc3OCA+IDM0NzU4NzgxIiwNCiAgICAgICJBZmZpbGluZXRDYXRl
213
217
  Z29yeUlkUGF0aCI6ICIxNCINCiAgICB9LA0KICAgIHsNCiAgICAgICJMYXN0
214
- U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MjQwNDgyMDAwMCswMTAwKVwvIiwN
218
+ U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MzA5NjY4MDAwMCswMTAwKVwvIiwN
215
219
  CiAgICAgICJMYXN0UHJvZHVjdENoYW5nZSI6ICJcL0RhdGUoMTM4MjQzMjQw
216
- MDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjY2MTk5NSwNCiAg
220
+ MDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjcwMzA5NCwNCiAg
217
221
  ICAgICJQcm9kdWN0SWQiOiA1ODA4NTg3NTAsDQogICAgICAiQXJ0aWNsZU51
218
222
  bWJlciI6ICJBQkNEXzAwMDE1NiIsDQogICAgICAiU2hvcElkIjogMTc0OCwN
219
223
  CiAgICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IFNob3dDYXNlIiwNCiAg
@@ -270,10 +274,10 @@ http_interactions:
270
274
  bUlkIjogODk5MSwNCiAgICAgICJTaG9wQ2F0ZWdvcnlJZFBhdGgiOiAiMzQ3
271
275
  NTg3NTQgPiAzNDc1ODc3OCA+IDM0NzU4NzgxIiwNCiAgICAgICJBZmZpbGlu
272
276
  ZXRDYXRlZ29yeUlkUGF0aCI6ICIxNCINCiAgICB9LA0KICAgIHsNCiAgICAg
273
- ICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MjQwNDgyMDAwMCswMTAw
277
+ ICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MzA5NjY4MDAwMCswMTAw
274
278
  KVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENoYW5nZSI6ICJcL0RhdGUoMTM4
275
- MjQzMjQwMDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjY2MTk5
276
- NSwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg3NTksDQogICAgICAiQXJ0
279
+ MjQzMjQwMDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjcwMzA5
280
+ NCwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg3NTksDQogICAgICAiQXJ0
277
281
  aWNsZU51bWJlciI6ICJBQkNEXzAwMDE2NSIsDQogICAgICAiU2hvcElkIjog
278
282
  MTc0OCwNCiAgICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IFNob3dDYXNl
279
283
  IiwNCiAgICAgICJQcm9kdWN0TmFtZSI6ICJKZWFucyDCtE1pbGFub8K0LCBE
@@ -329,9 +333,9 @@ http_interactions:
329
333
  ZWdvcnlJZFBhdGgiOiAiMzQ3NTg3NTQgPiAzNDc1ODc3OCA+IDM0NzU4Nzgx
330
334
  IiwNCiAgICAgICJBZmZpbGluZXRDYXRlZ29yeUlkUGF0aCI6ICIxNCINCiAg
331
335
  ICB9LA0KICAgIHsNCiAgICAgICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUo
332
- MTM5MjQwNDgyMDAwMCswMTAwKVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENo
336
+ MTM5MzA5NjY4MDAwMCswMTAwKVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENo
333
337
  YW5nZSI6ICJcL0RhdGUoMTM4MjQzMjQwMDAwMCswMjAwKVwvIiwNCiAgICAg
334
- ICJTY29yZSI6IDEuMjY2MTk5NSwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4
338
+ ICJTY29yZSI6IDEuMjcwMzA5NCwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4
335
339
  NTg3NjAsDQogICAgICAiQXJ0aWNsZU51bWJlciI6ICJBQkNEXzAwMDE2NiIs
336
340
  DQogICAgICAiU2hvcElkIjogMTc0OCwNCiAgICAgICJTaG9wVGl0bGUiOiAi
337
341
  YWZmaWxpbmV0IFNob3dDYXNlIiwNCiAgICAgICJQcm9kdWN0TmFtZSI6ICJK
@@ -389,9 +393,9 @@ http_interactions:
389
393
  ODk5MSwNCiAgICAgICJTaG9wQ2F0ZWdvcnlJZFBhdGgiOiAiMzQ3NTg3NTQg
390
394
  PiAzNDc1ODc3OCA+IDM0NzU4NzgxIiwNCiAgICAgICJBZmZpbGluZXRDYXRl
391
395
  Z29yeUlkUGF0aCI6ICIxNCINCiAgICB9LA0KICAgIHsNCiAgICAgICJMYXN0
392
- U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MjQwNDgyMDAwMCswMTAwKVwvIiwN
396
+ U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MzA5NjY4MDAwMCswMTAwKVwvIiwN
393
397
  CiAgICAgICJMYXN0UHJvZHVjdENoYW5nZSI6ICJcL0RhdGUoMTM4MjQzMjQw
394
- MDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjY2MTk5NSwNCiAg
398
+ MDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjcwMzA5NCwNCiAg
395
399
  ICAgICJQcm9kdWN0SWQiOiA1ODA4NTg4ODMsDQogICAgICAiQXJ0aWNsZU51
396
400
  bWJlciI6ICJBQkNEXzAwMDI4OSIsDQogICAgICAiU2hvcElkIjogMTc0OCwN
397
401
  CiAgICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IFNob3dDYXNlIiwNCiAg
@@ -447,10 +451,10 @@ http_interactions:
447
451
  ICAiUHJvZ3JhbUlkIjogODk5MSwNCiAgICAgICJTaG9wQ2F0ZWdvcnlJZFBh
448
452
  dGgiOiAiMzQ3NTg3ODQgPiAzNDc1ODgwMCA+IDM0NzU4ODAzIiwNCiAgICAg
449
453
  ICJBZmZpbGluZXRDYXRlZ29yeUlkUGF0aCI6ICIxNCINCiAgICB9LA0KICAg
450
- IHsNCiAgICAgICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MjQwNDgy
454
+ IHsNCiAgICAgICJMYXN0U2hvcFVwZGF0ZSI6ICJcL0RhdGUoMTM5MzA5NjY4
451
455
  MDAwMCswMTAwKVwvIiwNCiAgICAgICJMYXN0UHJvZHVjdENoYW5nZSI6ICJc
452
456
  L0RhdGUoMTM4MjQzMjQwMDAwMCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6
453
- IDEuMjY2MTk5NSwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg4ODUsDQog
457
+ IDEuMjcwMzA5NCwNCiAgICAgICJQcm9kdWN0SWQiOiA1ODA4NTg4ODUsDQog
454
458
  ICAgICAiQXJ0aWNsZU51bWJlciI6ICJBQkNEXzAwMDI5MSIsDQogICAgICAi
455
459
  U2hvcElkIjogMTc0OCwNCiAgICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0
456
460
  IFNob3dDYXNlIiwNCiAgICAgICJQcm9kdWN0TmFtZSI6ICJKZWFucyB0cm91
@@ -505,9 +509,9 @@ http_interactions:
505
509
  MSwNCiAgICAgICJTaG9wQ2F0ZWdvcnlJZFBhdGgiOiAiMzQ3NTg3ODQgPiAz
506
510
  NDc1ODgwMCA+IDM0NzU4ODAzIiwNCiAgICAgICJBZmZpbGluZXRDYXRlZ29y
507
511
  eUlkUGF0aCI6ICIxNCINCiAgICB9LA0KICAgIHsNCiAgICAgICJMYXN0U2hv
508
- cFVwZGF0ZSI6ICJcL0RhdGUoMTM5MjQwNDgyMDAwMCswMTAwKVwvIiwNCiAg
512
+ cFVwZGF0ZSI6ICJcL0RhdGUoMTM5MzA5NjY4MDAwMCswMTAwKVwvIiwNCiAg
509
513
  ICAgICJMYXN0UHJvZHVjdENoYW5nZSI6ICJcL0RhdGUoMTM4MjQzMjQwMDAw
510
- MCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjY2MTk5NSwNCiAgICAg
514
+ MCswMjAwKVwvIiwNCiAgICAgICJTY29yZSI6IDEuMjcwMzA5NCwNCiAgICAg
511
515
  ICJQcm9kdWN0SWQiOiA1ODA4NTg4ODYsDQogICAgICAiQXJ0aWNsZU51bWJl
512
516
  ciI6ICJBQkNEXzAwMDI5MiIsDQogICAgICAiU2hvcElkIjogMTc0OCwNCiAg
513
517
  ICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IFNob3dDYXNlIiwNCiAgICAg
@@ -563,9 +567,9 @@ http_interactions:
563
567
  OTkxLA0KICAgICAgIlNob3BDYXRlZ29yeUlkUGF0aCI6ICIzNDc1ODc4NCA+
564
568
  IDM0NzU4ODAwID4gMzQ3NTg4MDMiLA0KICAgICAgIkFmZmlsaW5ldENhdGVn
565
569
  b3J5SWRQYXRoIjogIjE0Ig0KICAgIH0sDQogICAgew0KICAgICAgIkxhc3RT
566
- aG9wVXBkYXRlIjogIlwvRGF0ZSgxMzkyNDA0ODIwMDAwKzAxMDApXC8iLA0K
570
+ aG9wVXBkYXRlIjogIlwvRGF0ZSgxMzkzMDk2NjgwMDAwKzAxMDApXC8iLA0K
567
571
  ICAgICAgIkxhc3RQcm9kdWN0Q2hhbmdlIjogIlwvRGF0ZSgxMzgyNDMyNDAw
568
- MDAwKzAyMDApXC8iLA0KICAgICAgIlNjb3JlIjogMS4yNjYxOTk1LA0KICAg
572
+ MDAwKzAyMDApXC8iLA0KICAgICAgIlNjb3JlIjogMS4yNzAzMDk0LA0KICAg
569
573
  ICAgIlByb2R1Y3RJZCI6IDU4MDg1ODg3OCwNCiAgICAgICJBcnRpY2xlTnVt
570
574
  YmVyIjogIkFCQ0RfMDAwMjg0IiwNCiAgICAgICJTaG9wSWQiOiAxNzQ4LA0K
571
575
  ICAgICAgIlNob3BUaXRsZSI6ICJhZmZpbGluZXQgU2hvd0Nhc2UiLA0KICAg
@@ -623,5 +627,5 @@ http_interactions:
623
627
  ICAiQWZmaWxpbmV0Q2F0ZWdvcnlJZFBhdGgiOiAiMTQiDQogICAgfQ0KICBd
624
628
  LA0KICAiRmFjZXRzIjogW10NCn0=
625
629
  http_version:
626
- recorded_at: Sat, 15 Feb 2014 18:03:48 GMT
630
+ recorded_at: Sun, 23 Feb 2014 16:03:00 GMT
627
631
  recorded_with: VCR 2.8.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetShopList?CurrentPage&LogoScale&PageSize&Password=1TuKEGkOJJ24dN07ByOy&Query&UpdatedAfter&publisherId=580442
5
+ uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetShopList?Password=1TuKEGkOJJ24dN07ByOy&publisherId=580442
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -18,20 +18,16 @@ http_interactions:
18
18
  code: 200
19
19
  message: OK
20
20
  headers:
21
- Date:
22
- - Sat, 15 Feb 2014 18:02:11 GMT
23
- Server:
24
- - Microsoft-IIS/6.0
25
- X-Powered-By:
26
- - ASP.NET
27
- X-Aspnet-Version:
28
- - 4.0.30319
29
21
  Content-Length:
30
22
  - '485'
31
- Cache-Control:
32
- - private
33
23
  Content-Type:
34
24
  - application/json
25
+ Server:
26
+ - Microsoft-IIS/7.5
27
+ X-Powered-By:
28
+ - ASP.NET
29
+ Date:
30
+ - Sun, 23 Feb 2014 16:02:59 GMT
35
31
  body:
36
32
  encoding: ASCII-8BIT
37
33
  string: !binary |-
@@ -40,12 +36,12 @@ http_interactions:
40
36
  cyI6IDEsDQogICAgIkN1cnJlbnRQYWdlIjogMQ0KICB9LA0KICAiU2hvcHMi
41
37
  OiBbDQogICAgew0KICAgICAgIlNob3BJZCI6IDE3NDgsDQogICAgICAiUHJv
42
38
  Z3JhbUlkIjogODk5MSwNCiAgICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0
43
- IFNob3dDYXNlIiwNCiAgICAgICJMYXN0VXBkYXRlIjogIlwvRGF0ZSgxMzky
44
- NDA0ODIwMDAwKzAxMDApXC8iLA0KICAgICAgIlNob3BMaW5rIjogImFmZmls
39
+ IFNob3dDYXNlIiwNCiAgICAgICJMYXN0VXBkYXRlIjogIlwvRGF0ZSgxMzkz
40
+ MDk2NjgwMDAwKzAxMDApXC8iLA0KICAgICAgIlNob3BMaW5rIjogImFmZmls
45
41
  aS5uZXQiLA0KICAgICAgIlByb2R1Y3RDb3VudCI6IDMxMywNCiAgICAgICJM
46
42
  b2dvIjogew0KICAgICAgICAiTG9nb1NjYWxlIjogIk5vTG9nbyIsDQogICAg
47
43
  ICAgICJVUkwiOiAiIiwNCiAgICAgICAgIldpZHRoIjogMCwNCiAgICAgICAg
48
44
  IkhlaWdodCI6IDANCiAgICAgIH0NCiAgICB9DQogIF0NCn0=
49
45
  http_version:
50
- recorded_at: Sat, 15 Feb 2014 18:02:11 GMT
46
+ recorded_at: Sun, 23 Feb 2014 16:02:59 GMT
51
47
  recorded_with: VCR 2.8.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/SearchProducts?CategoryIds=&CurrentPage&ExcludeSubCategories&FQ&FacetFields=&FacetValueLimit&ImageScales=&LogoScales=&MaximumPrice&MinimumPrice&PageSize&Password=1TuKEGkOJJ24dN07ByOy&Query&ShopIdMode=Include&ShopIds=&SortBy&SortOrder=descending&UseAffilinetCategories&WithImageOnly&publisherId=580442
5
+ uri: https://product-api.affili.net/V3/productservice.svc/JSON/SearchProducts?Password=1TuKEGkOJJ24dN07ByOy&publisherId=580442&query
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -18,20 +18,24 @@ http_interactions:
18
18
  code: 400
19
19
  message: Bad Request
20
20
  headers:
21
+ Date:
22
+ - Sun, 23 Feb 2014 16:04:35 GMT
23
+ Server:
24
+ - Microsoft-IIS/6.0
25
+ X-Powered-By:
26
+ - ASP.NET
27
+ X-Aspnet-Version:
28
+ - 4.0.30319
21
29
  Content-Length:
22
30
  - '112'
31
+ Cache-Control:
32
+ - private
23
33
  Content-Type:
24
34
  - application/json; charset=utf-8
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 18:21:46 GMT
31
35
  body:
32
36
  encoding: UTF-8
33
37
  string: '{"ErrorMessages":[{"Key":"2021950074","Value":"FilterQueries, CategoryIds
34
38
  or Query should be set in request."}]}'
35
39
  http_version:
36
- recorded_at: Sat, 15 Feb 2014 18:21:46 GMT
40
+ recorded_at: Sun, 23 Feb 2014 16:04:36 GMT
37
41
  recorded_with: VCR 2.8.0
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Category do
4
+ subject { Affilinet::Category.new double('Affilinet::Client') }
5
+
6
+ describe '#all' do
7
+ it 'correctly queries the client' do
8
+ expect(subject.client).to receive(:get).with('GetCategoryList', {'ShopId' => 0})
9
+ subject.shop_id(0).all
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Client, :vcr do
4
+ it 'raises ArgumentError if initialized with no options' do
5
+ expect do
6
+ Affilinet::Client.new
7
+ end.to raise_error ArgumentError
8
+ end
9
+
10
+ context 'initialized with credentials' do
11
+ subject { Affilinet::Client.new publisher_id: 580442, password: '1TuKEGkOJJ24dN07ByOy' }
12
+
13
+ it 'raises Faraday::Error::ParsingError on wrong API requests' do
14
+ expect do
15
+ subject.search.all
16
+ end.to raise_error Faraday::Error::ParsingError
17
+ end
18
+
19
+ describe '#connection' do
20
+ it 'is an instance of Faraday::Connection' do
21
+ expect(subject.connection).to be_an_instance_of Faraday::Connection
22
+ end
23
+ end
24
+
25
+ describe '#options' do
26
+ it 'includes publisher_id' do
27
+ expect(subject.options).to include(:publisher_id)
28
+ end
29
+
30
+ it 'includes password' do
31
+ expect(subject.options).to include(:password)
32
+ end
33
+ end
34
+
35
+ describe '#categories' do
36
+ it 'returns a Affilinet::Middleware::Mash' do
37
+ expect(subject.categories.shop_id(0).all).to be_an_instance_of Affilinet::Middleware::Mash
38
+ end
39
+ end
40
+
41
+ describe '#properties' do
42
+ it 'returns a Affilinet::Middleware::Mash' do
43
+ expect(subject.properties.shop_id(1748).all).to be_an_instance_of Affilinet::Middleware::Mash
44
+ end
45
+ end
46
+
47
+ describe '#shops' do
48
+ it 'returns a Affilinet::Middleware::Mash' do
49
+ expect(subject.shops.all).to be_an_instance_of Affilinet::Middleware::Mash
50
+ end
51
+ end
52
+
53
+ describe '#products' do
54
+ it 'returns a Affilinet::Middleware::Mash' do
55
+ expect(subject.products.product_ids([580858761,580858759]).all).to be_an_instance_of Affilinet::Middleware::Mash
56
+ end
57
+ end
58
+
59
+ describe '#search' do
60
+ it 'returns a Affilinet::Middleware::Mash' do
61
+ expect(subject.search.query('jeans').all).to be_an_instance_of Affilinet::Middleware::Mash
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Middleware::Mash do
4
+ subject { Affilinet::Middleware::Mash }
5
+
6
+ describe '::join_arrays' do
7
+ it 'joins array values using a comma' do
8
+ foo = {bar: ['baz', 'fubar']}
9
+ expect(subject.join_arrays foo).to eq({bar: 'baz,fubar'})
10
+ end
11
+ end
12
+
13
+ describe '::camelize_keys' do
14
+ it 'camelizes all the keys' do
15
+ foo = {foo_bar: 'foo', f_q: 'bar'}
16
+ expect(subject.camelize_keys foo).to eq({'FooBar' => 'foo', 'FQ' => 'bar'})
17
+ end
18
+ end
19
+
20
+ describe '::camelize' do
21
+ it 'camelizes words' do
22
+ expect(subject.camelize :foo_bar_baz).to eq('FooBarBaz')
23
+ end
24
+ end
25
+
26
+ describe '::underscore' do
27
+ it 'underscores words' do
28
+ expect(subject.underscore 'FooBarBaz').to eq('foo_bar_baz')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Product do
4
+ subject { Affilinet::Product.new double('Affilinet::Client') }
5
+
6
+ describe '#to_query' do
7
+ it 'generates the correct Hash' do
8
+ shop = subject.logo_scales(['10x2', '3x4'])
9
+ expect(shop.to_query).to eq({'LogoScales' => '10x2,3x4'})
10
+ end
11
+ end
12
+
13
+ describe '#all' do
14
+ it 'correctly queries the client' do
15
+ expect(subject.client).to receive(:get).with('GetProducts', {'ProductIds' => '1,2,3', 'LogoScales' => '3x4'})
16
+ subject.logo_scales('3x4').product_ids([1, 2, 3]).all
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Property do
4
+ subject { Affilinet::Property.new double('Affilinet::Client') }
5
+
6
+ describe '#all' do
7
+ it 'correctly queries the client' do
8
+ expect(subject.client).to receive(:get).with('GetPropertyList', {'ShopId' => 0})
9
+ subject.shop_id(0).all
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Search do
4
+ subject { Affilinet::Search.new double('Affilinet::Client') }
5
+
6
+ describe '#all' do
7
+ it 'correctly queries the client' do
8
+ expect(subject.client).to receive(:get).with('SearchProducts', {'query' => 'jeans'})
9
+ subject.query('jeans').all
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Affilinet::Shop do
4
+ subject { Affilinet::Shop.new double('Affilinet::Client') }
5
+
6
+ [:logo_scale, :current_page, :page_size, :updated_after, :query].each do |attr|
7
+ describe "##{attr}" do
8
+ it "sets the #{attr}" do
9
+ shop = subject.send(attr, 'foo')
10
+ expect(shop.criteria[attr]).to eq('foo')
11
+ end
12
+
13
+ it "replaces the #{attr}" do
14
+ shop = subject.send(attr, 'bar')
15
+ expect(shop.criteria[attr]).to eq('bar')
16
+ shop = subject.send(attr, 'baz')
17
+ expect(shop.criteria[attr]).to eq('baz')
18
+ end
19
+ end
20
+ end
21
+
22
+ describe 'fluent interface basics' do
23
+ it 'successfully chains methods' do
24
+ shop = subject.current_page(4).page_size(50)
25
+ expect(shop.criteria[:current_page]).to eq(4)
26
+ expect(shop.criteria[:page_size]).to eq(50)
27
+ end
28
+
29
+ it 'spawns new instances for every chained method' do
30
+ shop = subject.current_page(2)
31
+ shop_first = shop.page_size(50)
32
+ shop_second = shop.page_size(50)
33
+ expect(shop_first).not_to equal(shop_second)
34
+ expect(shop_first.criteria[:current_page]).to eq(shop_second.criteria[:current_page])
35
+ end
36
+ end
37
+
38
+ describe '#to_query' do
39
+ it 'generates the correct Hash' do
40
+ shop = subject.current_page(1).page_size(100)
41
+ expect(shop.to_query).to eq({'PageSize' => 100, 'CurrentPage' => 1})
42
+ end
43
+ end
44
+
45
+ describe '#all' do
46
+ it 'correctly queries the client' do
47
+ expect(subject.client).to receive(:get).with('GetShopList', {'CurrentPage' => 2})
48
+ subject.current_page(2).all
49
+ end
50
+ end
51
+
52
+ describe '#first' do
53
+ it 'only requests one element, correctly recalculating pagination' do
54
+ expect(subject.client).to receive(:get).with('GetShopList', {'CurrentPage' => 71, 'PageSize' => 1})
55
+ subject.current_page(3).page_size(35).first
56
+ end
57
+
58
+ it 'returns all if no page or size is provided' do
59
+ expect(subject.client).to receive(:get).with('GetShopList', {})
60
+ subject.first
61
+ end
62
+ end
63
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: affilinet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Sampaio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-15 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -144,6 +144,7 @@ extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
146
  - .gitignore
147
+ - .rspec
147
148
  - .ruby-gemset
148
149
  - .ruby-version
149
150
  - Gemfile
@@ -152,21 +153,30 @@ files:
152
153
  - Rakefile
153
154
  - affilinet.gemspec
154
155
  - lib/affilinet.rb
156
+ - lib/affilinet/category.rb
155
157
  - lib/affilinet/client.rb
158
+ - lib/affilinet/fluent_interface.rb
156
159
  - lib/affilinet/middleware/mash.rb
157
160
  - lib/affilinet/middleware/mashify.rb
158
161
  - lib/affilinet/middleware/parse_json.rb
162
+ - lib/affilinet/product.rb
163
+ - lib/affilinet/property.rb
164
+ - lib/affilinet/search.rb
165
+ - lib/affilinet/shop.rb
159
166
  - lib/affilinet/version.rb
160
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/performs_the_GET_request_to_the_correct_endpoint.yml
161
167
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/returns_a_Affilinet_Middleware_Mash.yml
162
168
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_products/returns_a_Affilinet_Middleware_Mash.yml
163
169
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_properties/returns_a_Affilinet_Middleware_Mash.yml
164
170
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_search/returns_a_Affilinet_Middleware_Mash.yml
165
171
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_shops/returns_a_Affilinet_Middleware_Mash.yml
166
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/categories/performs_the_GET_request_to_the_correct_endpoint.yml
167
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Error_on_wrong_API_requests.yml
168
172
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Faraday_Error_ParsingError_on_wrong_API_requests.yml
169
- - spec/lib/client_spec.rb
173
+ - spec/lib/affilinet/category_spec.rb
174
+ - spec/lib/affilinet/client_spec.rb
175
+ - spec/lib/affilinet/middleware/mash.rb
176
+ - spec/lib/affilinet/product_spec.rb
177
+ - spec/lib/affilinet/property_spec.rb
178
+ - spec/lib/affilinet/search_spec.rb
179
+ - spec/lib/affilinet/shop_spec.rb
170
180
  - spec/spec_helper.rb
171
181
  homepage: http://github.com/esampaio/affilinet
172
182
  licenses:
@@ -193,14 +203,17 @@ signing_key:
193
203
  specification_version: 4
194
204
  summary: Gem to access the rest (actually only get but...) API of affilinet
195
205
  test_files:
196
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/performs_the_GET_request_to_the_correct_endpoint.yml
197
206
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_categories/returns_a_Affilinet_Middleware_Mash.yml
198
207
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_products/returns_a_Affilinet_Middleware_Mash.yml
199
208
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_properties/returns_a_Affilinet_Middleware_Mash.yml
200
209
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_search/returns_a_Affilinet_Middleware_Mash.yml
201
210
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/_shops/returns_a_Affilinet_Middleware_Mash.yml
202
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/categories/performs_the_GET_request_to_the_correct_endpoint.yml
203
- - spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Error_on_wrong_API_requests.yml
204
211
  - spec/cassettes/Affilinet_Client/initialized_with_credentials/raises_Faraday_Error_ParsingError_on_wrong_API_requests.yml
205
- - spec/lib/client_spec.rb
212
+ - spec/lib/affilinet/category_spec.rb
213
+ - spec/lib/affilinet/client_spec.rb
214
+ - spec/lib/affilinet/middleware/mash.rb
215
+ - spec/lib/affilinet/product_spec.rb
216
+ - spec/lib/affilinet/property_spec.rb
217
+ - spec/lib/affilinet/search_spec.rb
218
+ - spec/lib/affilinet/shop_spec.rb
206
219
  - spec/spec_helper.rb
@@ -1,46 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetCategoryList?Password=1TuKEGkOJJ24dN07ByOy&ShopId=0&publisherId=580442
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - Faraday v0.8.9
12
- Accept-Encoding:
13
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
- Accept:
15
- - '*/*'
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Content-Length:
22
- - '428'
23
- Content-Type:
24
- - application/json
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 17:41:51 GMT
31
- body:
32
- encoding: ASCII-8BIT
33
- string: !binary |-
34
- 77u/ew0KICAiR2V0Q2F0ZWdvcnlMaXN0U3VtbWFyeSI6IHsNCiAgICAiUmVj
35
- b3JkcyI6IDEsDQogICAgIlRvdGFsUmVjb3JkcyI6IDEsDQogICAgIlRvdGFs
36
- UGFnZXMiOiAxLA0KICAgICJDdXJyZW50UGFnZSI6IDEsDQogICAgIlByb2dy
37
- YW1JZCI6IDAsDQogICAgIlByb2dyYW1UaXRsZSI6ICJhZmZpbGluZXQiLA0K
38
- ICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IiwNCiAgICAiU2hvcElkIjog
39
- MA0KICB9LA0KICAiQ2F0ZWdvcmllcyI6IFsNCiAgICB7DQogICAgICAiSWQi
40
- OiAxNCwNCiAgICAgICJJZFBhdGgiOiAiMTQiLA0KICAgICAgIlRpdGxlIjog
41
- IkNsb3RoZXMgJiBBY2Nlc3NvcmllcyAiLA0KICAgICAgIlRpdGxlUGF0aCI6
42
- ICJDbG90aGVzICYgQWNjZXNzb3JpZXMgIiwNCiAgICAgICJQcm9kdWN0Q291
43
- bnQiOiAzMTMNCiAgICB9DQogIF0NCn0=
44
- http_version:
45
- recorded_at: Sat, 15 Feb 2014 17:41:51 GMT
46
- recorded_with: VCR 2.8.0
@@ -1,50 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/GetCategoryList?Password=1TuKEGkOJJ24dN07ByOy&ShopId=0&publisherId=580442
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - Faraday v0.8.9
12
- Accept-Encoding:
13
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
- Accept:
15
- - '*/*'
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Date:
22
- - Sat, 15 Feb 2014 17:40:35 GMT
23
- Server:
24
- - Microsoft-IIS/6.0
25
- X-Powered-By:
26
- - ASP.NET
27
- X-Aspnet-Version:
28
- - 4.0.30319
29
- Content-Length:
30
- - '428'
31
- Cache-Control:
32
- - private
33
- Content-Type:
34
- - application/json
35
- body:
36
- encoding: ASCII-8BIT
37
- string: !binary |-
38
- 77u/ew0KICAiR2V0Q2F0ZWdvcnlMaXN0U3VtbWFyeSI6IHsNCiAgICAiUmVj
39
- b3JkcyI6IDEsDQogICAgIlRvdGFsUmVjb3JkcyI6IDEsDQogICAgIlRvdGFs
40
- UGFnZXMiOiAxLA0KICAgICJDdXJyZW50UGFnZSI6IDEsDQogICAgIlByb2dy
41
- YW1JZCI6IDAsDQogICAgIlByb2dyYW1UaXRsZSI6ICJhZmZpbGluZXQiLA0K
42
- ICAgICJTaG9wVGl0bGUiOiAiYWZmaWxpbmV0IiwNCiAgICAiU2hvcElkIjog
43
- MA0KICB9LA0KICAiQ2F0ZWdvcmllcyI6IFsNCiAgICB7DQogICAgICAiSWQi
44
- OiAxNCwNCiAgICAgICJJZFBhdGgiOiAiMTQiLA0KICAgICAgIlRpdGxlIjog
45
- IkNsb3RoZXMgJiBBY2Nlc3NvcmllcyAiLA0KICAgICAgIlRpdGxlUGF0aCI6
46
- ICJDbG90aGVzICYgQWNjZXNzb3JpZXMgIiwNCiAgICAgICJQcm9kdWN0Q291
47
- bnQiOiAzMTMNCiAgICB9DQogIF0NCn0=
48
- http_version:
49
- recorded_at: Sat, 15 Feb 2014 17:40:35 GMT
50
- recorded_with: VCR 2.8.0
@@ -1,37 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://product-api.affili.net/V3/productservice.svc/JSON/SearchProducts?CategoryIds=&CurrentPage&ExcludeSubCategories&FQ&FacetFields=&FacetValueLimit&ImageScales=&LogoScales=&MaximumPrice&MinimumPrice&PageSize&Password=1TuKEGkOJJ24dN07ByOy&Query&ShopIdMode=Include&ShopIds=&SortBy&SortOrder=descending&UseAffilinetCategories&WithImageOnly&publisherId=580442
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - Faraday v0.8.9
12
- Accept-Encoding:
13
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
- Accept:
15
- - '*/*'
16
- response:
17
- status:
18
- code: 400
19
- message: Bad Request
20
- headers:
21
- Content-Length:
22
- - '112'
23
- Content-Type:
24
- - application/json; charset=utf-8
25
- Server:
26
- - Microsoft-IIS/7.5
27
- X-Powered-By:
28
- - ASP.NET
29
- Date:
30
- - Sat, 15 Feb 2014 18:21:17 GMT
31
- body:
32
- encoding: UTF-8
33
- string: '{"ErrorMessages":[{"Key":"2021950074","Value":"FilterQueries, CategoryIds
34
- or Query should be set in request."}]}'
35
- http_version:
36
- recorded_at: Sat, 15 Feb 2014 18:21:18 GMT
37
- recorded_with: VCR 2.8.0
@@ -1,98 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Affilinet::Client, :vcr do
4
- it 'raises ArgumentError if initialized with no options' do
5
- expect do
6
- Affilinet::Client.new
7
- end.to raise_error ArgumentError
8
- end
9
-
10
- context 'initialized with credentials' do
11
- subject { Affilinet::Client.new publisher_id: 580442, password: '1TuKEGkOJJ24dN07ByOy' }
12
-
13
- it 'raises Faraday::Error::ParsingError on wrong API requests' do
14
- expect do
15
- subject.search
16
- end.to raise_error Faraday::Error::ParsingError
17
- end
18
-
19
- describe '#connection' do
20
- it 'is an instance of Faraday::Connection' do
21
- expect(subject.connection).to be_an_instance_of Faraday::Connection
22
- end
23
- end
24
-
25
- describe '#options' do
26
- it 'includes publisher_id' do
27
- expect(subject.options).to include(:publisher_id)
28
- end
29
-
30
- it 'includes password' do
31
- expect(subject.options).to include(:password)
32
- end
33
- end
34
-
35
- describe '#categories' do
36
- it 'performs the GET request to the correct endpoint' do
37
- expect(subject).to receive(:get).with('GetCategoryList', {'ShopId'=>0})
38
- subject.categories
39
- end
40
-
41
- it 'returns a Affilinet::Middleware::Mash' do
42
- expect(subject.categories).to be_an_instance_of Affilinet::Middleware::Mash
43
- end
44
- end
45
-
46
- describe '#properties' do
47
- it 'performs the GET request to the correct endpoint' do
48
- expect(subject).to receive(:get).with('GetPropertyList', {'ShopId'=>1})
49
- subject.properties 1
50
- end
51
-
52
- it 'returns a Affilinet::Middleware::Mash' do
53
- expect(subject.properties 1748).to be_an_instance_of Affilinet::Middleware::Mash
54
- end
55
- end
56
-
57
- describe '#shops' do
58
- it 'performs the GET request to the correct endpoint' do
59
- expect(subject).to receive(:get).with('GetShopList', {"LogoScale"=>nil,
60
- "CurrentPage"=>nil, "PageSize"=>nil, "Query"=>nil, "UpdatedAfter"=>nil})
61
- subject.shops
62
- end
63
-
64
- it 'returns a Affilinet::Middleware::Mash' do
65
- expect(subject.shops).to be_an_instance_of Affilinet::Middleware::Mash
66
- end
67
- end
68
-
69
- describe '#products' do
70
- it 'performs the GET request to the correct endpoint' do
71
- expect(subject).to receive(:get).with('GetProducts', {"ProductIds"=>"",
72
- "ImageScales"=>"", "LogoScales"=>""})
73
- subject.products
74
- end
75
-
76
- it 'returns a Affilinet::Middleware::Mash' do
77
- expect(subject.products [580858761,580858759]).to be_an_instance_of Affilinet::Middleware::Mash
78
- end
79
- end
80
-
81
- describe '#search' do
82
- it 'performs the GET request to the correct endpoint' do
83
- expect(subject).to receive(:get).with('SearchProducts', {"ShopIds"=>"",
84
- "ShopIdMode"=>"Include", "Query"=>nil, "CategoryIds"=>"",
85
- "UseAffilinetCategories"=>nil, "ExcludeSubCategories"=>nil,
86
- "WithImageOnly"=>nil, "ImageScales"=>"", "LogoScales"=>"",
87
- "CurrentPage"=>nil, "PageSize"=>nil, "MinimumPrice"=>nil,
88
- "MaximumPrice"=>nil, "SortBy"=>nil, "SortOrder"=>"descending",
89
- "FacetFields"=>"", "FacetValueLimit"=>nil, "FQ"=>nil})
90
- subject.search
91
- end
92
-
93
- it 'returns a Affilinet::Middleware::Mash' do
94
- expect(subject.search query: 'jeans').to be_an_instance_of Affilinet::Middleware::Mash
95
- end
96
- end
97
- end
98
- end