shopify_client 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +30 -0
- data/Rakefile +11 -0
- data/lib/shopify_client.rb +10 -0
- data/lib/shopify_client/api/custom_collection.rb +22 -0
- data/lib/shopify_client/api/order.rb +22 -0
- data/lib/shopify_client/api/product.rb +21 -0
- data/lib/shopify_client/api/recurring_application_charge.rb +43 -0
- data/lib/shopify_client/api/script_tag.rb +35 -0
- data/lib/shopify_client/api/shop.rb +16 -0
- data/lib/shopify_client/api/smart_collection.rb +22 -0
- data/lib/shopify_client/api/webhook.rb +34 -0
- data/lib/shopify_client/base.rb +57 -0
- data/lib/shopify_client/client.rb +91 -0
- data/lib/shopify_client/custom_collection.rb +28 -0
- data/lib/shopify_client/error.rb +13 -0
- data/lib/shopify_client/error/client_error.rb +23 -0
- data/lib/shopify_client/error/server_error.rb +15 -0
- data/lib/shopify_client/image.rb +13 -0
- data/lib/shopify_client/order.rb +29 -0
- data/lib/shopify_client/product.rb +22 -0
- data/lib/shopify_client/recurring_application_charge.rb +20 -0
- data/lib/shopify_client/request/content_type.rb +20 -0
- data/lib/shopify_client/response/parse_json.rb +22 -0
- data/lib/shopify_client/response/raise_error.rb +23 -0
- data/lib/shopify_client/script_tag.rb +19 -0
- data/lib/shopify_client/shop.rb +22 -0
- data/lib/shopify_client/smart_collection.rb +28 -0
- data/lib/shopify_client/version.rb +3 -0
- data/lib/shopify_client/webhook.rb +21 -0
- data/shopify_client.gemspec +28 -0
- data/test/fixtures/custom_collection.json +18 -0
- data/test/fixtures/custom_collections.json +19 -0
- data/test/fixtures/order.json +274 -0
- data/test/fixtures/orders.json +276 -0
- data/test/fixtures/product.json +140 -0
- data/test/fixtures/products.json +170 -0
- data/test/fixtures/recurring_application_charge.json +18 -0
- data/test/fixtures/recurring_application_charges.json +34 -0
- data/test/fixtures/script_tag.json +9 -0
- data/test/fixtures/script_tags.json +18 -0
- data/test/fixtures/shop.json +37 -0
- data/test/fixtures/smart_collection.json +25 -0
- data/test/fixtures/smart_collections.json +26 -0
- data/test/fixtures/webhook.json +10 -0
- data/test/fixtures/webhooks.json +20 -0
- data/test/shopify_client/api/custom_collection_spec.rb +54 -0
- data/test/shopify_client/api/order_spec.rb +68 -0
- data/test/shopify_client/api/product_spec.rb +66 -0
- data/test/shopify_client/api/recurring_application_charge_spec.rb +138 -0
- data/test/shopify_client/api/script_tag_spec.rb +109 -0
- data/test/shopify_client/api/shop_spec.rb +30 -0
- data/test/shopify_client/api/smart_collection_spec.rb +54 -0
- data/test/shopify_client/api/webhook_spec.rb +109 -0
- data/test/shopify_client/base_spec.rb +12 -0
- data/test/shopify_client/client_spec.rb +12 -0
- data/test/shopify_client/custom_collection_spec.rb +41 -0
- data/test/shopify_client/error/client_error_spec.rb +19 -0
- data/test/shopify_client/error/server_error_spec.rb +20 -0
- data/test/shopify_client/order_spec.rb +30 -0
- data/test/shopify_client/product_spec.rb +21 -0
- data/test/shopify_client/recurring_application_charge_spec.rb +20 -0
- data/test/shopify_client/script_tag_spec.rb +22 -0
- data/test/shopify_client/shop_spec.rb +14 -0
- data/test/shopify_client/smart_collection_spec.rb +41 -0
- data/test/shopify_client/webhook_spec.rb +22 -0
- data/test/shopify_client_spec.rb +10 -0
- data/test/test_helper.rb +13 -0
- metadata +235 -0
@@ -0,0 +1,109 @@
|
|
1
|
+
describe ShopifyClient::API::ScriptTag do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "#script_tags" do
|
8
|
+
it "requests all script_tags" do
|
9
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/script_tags.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 200, body: '')
|
12
|
+
|
13
|
+
@client.script_tags
|
14
|
+
|
15
|
+
assert_requested stubbed
|
16
|
+
end
|
17
|
+
|
18
|
+
it "filters by topic" do
|
19
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/script_tags.json?topic=orders/create").
|
20
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
21
|
+
to_return(status: 200, body: '')
|
22
|
+
|
23
|
+
@client.script_tags(:topic => 'orders/create')
|
24
|
+
|
25
|
+
assert_requested stubbed
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
it "returns an ShopifyClient::ScriptTag array" do
|
30
|
+
stub_request(:get, "https://example.myshopify.com/admin/script_tags.json").
|
31
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
32
|
+
to_return(status: 200, body: fixture('script_tags.json'))
|
33
|
+
|
34
|
+
script_tags = @client.script_tags
|
35
|
+
|
36
|
+
script_tags.size.must_equal 2
|
37
|
+
script_tags.first.must_be_instance_of ShopifyClient::ScriptTag
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#script_tag" do
|
43
|
+
it "requests an specific script_tag" do
|
44
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/script_tags/123.json").
|
45
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
46
|
+
to_return(status: 200, body: '')
|
47
|
+
|
48
|
+
@client.script_tag(123)
|
49
|
+
|
50
|
+
assert_requested stubbed
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns a ShopifyClient::ScriptTag" do
|
54
|
+
stub_request(:get, "https://example.myshopify.com/admin/script_tags/123.json").
|
55
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
56
|
+
to_return(status: 200, body: fixture('script_tag.json'))
|
57
|
+
|
58
|
+
script_tag = @client.script_tag(123)
|
59
|
+
|
60
|
+
script_tag.must_be_instance_of ShopifyClient::ScriptTag
|
61
|
+
script_tag.src.must_equal "http://js-aplenty.com/foo.js"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#create_script_tag" do
|
66
|
+
before do
|
67
|
+
@attributes = { event: "onload", src: "http://js-aplenty.com/foo.js" }
|
68
|
+
@request = stub_request(:post, "https://example.myshopify.com/admin/script_tags.json").
|
69
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" },
|
70
|
+
body: { script_tag: @attributes }).
|
71
|
+
to_return(status: 200, body: fixture('script_tag.json'))
|
72
|
+
end
|
73
|
+
|
74
|
+
it "posts with script_tag params" do
|
75
|
+
@client.create_script_tag(@attributes)
|
76
|
+
|
77
|
+
assert_requested @request
|
78
|
+
end
|
79
|
+
|
80
|
+
it "returns an initialized ScriptTag" do
|
81
|
+
script_tag = @client.create_script_tag(@attributes)
|
82
|
+
|
83
|
+
script_tag.must_be_instance_of ShopifyClient::ScriptTag
|
84
|
+
script_tag.id.must_equal 596726825
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#destroy_script_tag" do
|
90
|
+
before do
|
91
|
+
@request = stub_request(:delete, "https://example.myshopify.com/admin/script_tags/123.json").
|
92
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
93
|
+
to_return(status: 200)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "deletes to destroy a script_tag" do
|
97
|
+
@client.destroy_script_tag(123)
|
98
|
+
|
99
|
+
assert_requested @request
|
100
|
+
end
|
101
|
+
|
102
|
+
it "can receive a ShopifyClient::ScriptTag object" do
|
103
|
+
@client.destroy_script_tag(ShopifyClient::ScriptTag.new(id: 123))
|
104
|
+
|
105
|
+
assert_requested @request
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe ShopifyClient::API::Shop do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "#shop" do
|
8
|
+
it "requests the current shop" do
|
9
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/shop.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 200, body: '')
|
12
|
+
|
13
|
+
@client.shop
|
14
|
+
|
15
|
+
assert_requested stubbed
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns a ShopifyClient::Shop instance with data" do
|
19
|
+
stub_request(:get, "https://example.myshopify.com/admin/shop.json").
|
20
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
21
|
+
to_return(status: 200, body: fixture('shop.json'))
|
22
|
+
|
23
|
+
shop = @client.shop
|
24
|
+
|
25
|
+
shop.must_be_instance_of ShopifyClient::Shop
|
26
|
+
shop.name.must_equal "Apple Computers"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
describe ShopifyClient::API::SmartCollection do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "#smart_collections" do
|
8
|
+
it "requests all smart collections" do
|
9
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/smart_collections.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 200, body: '')
|
12
|
+
|
13
|
+
@client.smart_collections
|
14
|
+
|
15
|
+
assert_requested stubbed
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns an ShopifyClient::SmartCollection array" do
|
19
|
+
stub_request(:get, "https://example.myshopify.com/admin/smart_collections.json").
|
20
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
21
|
+
to_return(status: 200, body: fixture('smart_collections.json'))
|
22
|
+
|
23
|
+
smart_collections = @client.smart_collections
|
24
|
+
|
25
|
+
smart_collections.size.must_equal 1
|
26
|
+
smart_collections.first.must_be_instance_of ShopifyClient::SmartCollection
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#smart_collection" do
|
31
|
+
it "requests an specific smart collection" do
|
32
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/smart_collections/123.json").
|
33
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
34
|
+
to_return(status: 200, body: '')
|
35
|
+
|
36
|
+
@client.smart_collection(123)
|
37
|
+
|
38
|
+
assert_requested stubbed
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns a ShopifyClient::SmartCollection with data" do
|
42
|
+
stub_request(:get, "https://example.myshopify.com/admin/smart_collections/123.json").
|
43
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
44
|
+
to_return(status: 200, body: fixture('smart_collection.json'))
|
45
|
+
|
46
|
+
smart_collection = @client.smart_collection(123)
|
47
|
+
|
48
|
+
smart_collection.must_be_instance_of ShopifyClient::SmartCollection
|
49
|
+
smart_collection.handle.must_equal 'smart-ipods'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
describe ShopifyClient::API::Webhook do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "#webhooks" do
|
8
|
+
it "requests all webhooks" do
|
9
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/webhooks.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 200, body: '')
|
12
|
+
|
13
|
+
@client.webhooks
|
14
|
+
|
15
|
+
assert_requested stubbed
|
16
|
+
end
|
17
|
+
|
18
|
+
it "filters by topic" do
|
19
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/webhooks.json?topic=orders/create").
|
20
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
21
|
+
to_return(status: 200, body: '')
|
22
|
+
|
23
|
+
@client.webhooks(:topic => 'orders/create')
|
24
|
+
|
25
|
+
assert_requested stubbed
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
it "returns an ShopifyClient::Webhook array" do
|
30
|
+
stub_request(:get, "https://example.myshopify.com/admin/webhooks.json").
|
31
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
32
|
+
to_return(status: 200, body: fixture('webhooks.json'))
|
33
|
+
|
34
|
+
webhooks = @client.webhooks
|
35
|
+
|
36
|
+
webhooks.size.must_equal 2
|
37
|
+
webhooks.first.must_be_instance_of ShopifyClient::Webhook
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#webhook" do
|
43
|
+
it "requests an specific webhook" do
|
44
|
+
stubbed = stub_request(:get, "https://example.myshopify.com/admin/webhooks/123.json").
|
45
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
46
|
+
to_return(status: 200, body: '')
|
47
|
+
|
48
|
+
@client.webhook(123)
|
49
|
+
|
50
|
+
assert_requested stubbed
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns a ShopifyClient::Webhook" do
|
54
|
+
stub_request(:get, "https://example.myshopify.com/admin/webhooks/123.json").
|
55
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
56
|
+
to_return(status: 200, body: fixture('webhook.json'))
|
57
|
+
|
58
|
+
webhook = @client.webhook(123)
|
59
|
+
|
60
|
+
webhook.must_be_instance_of ShopifyClient::Webhook
|
61
|
+
webhook.format.must_equal "json"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#create_webhook" do
|
66
|
+
before do
|
67
|
+
@attributes = { :topic => "orders/create", :address => "http://whatever.hostname.com", :format => "json" }
|
68
|
+
@request = stub_request(:post, "https://example.myshopify.com/admin/webhooks.json").
|
69
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" },
|
70
|
+
body: { webhook: @attributes }).
|
71
|
+
to_return(status: 200, body: fixture('webhook.json'))
|
72
|
+
end
|
73
|
+
|
74
|
+
it "posts with webhook params" do
|
75
|
+
@client.create_webhook(@attributes)
|
76
|
+
|
77
|
+
assert_requested @request
|
78
|
+
end
|
79
|
+
|
80
|
+
it "returns an initialized Webhook" do
|
81
|
+
webhook = @client.create_webhook(@attributes)
|
82
|
+
|
83
|
+
webhook.must_be_instance_of ShopifyClient::Webhook
|
84
|
+
webhook.id.must_equal 4759306
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#destroy_webhook" do
|
90
|
+
before do
|
91
|
+
@request = stub_request(:delete, "https://example.myshopify.com/admin/webhooks/123.json").
|
92
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
93
|
+
to_return(status: 200)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "deletes to destroy a webhook" do
|
97
|
+
@client.destroy_webhook(123)
|
98
|
+
|
99
|
+
assert_requested @request
|
100
|
+
end
|
101
|
+
|
102
|
+
it "can receive a ShopifyClient::Webhook object" do
|
103
|
+
@client.destroy_webhook(ShopifyClient::Webhook.new(id: 123))
|
104
|
+
|
105
|
+
assert_requested @request
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
describe ShopifyClient::Client do
|
2
|
+
|
3
|
+
describe ".normalize_url" do
|
4
|
+
%w{ example.myshopify.com http://example.myshopify.com https://example.myshopify.com example.myshopify.com/admin }.each do |url|
|
5
|
+
it "normalizes https:// and /admin" do
|
6
|
+
normalized = ShopifyClient::Client.normalize_url url
|
7
|
+
normalized.must_equal "https://example.myshopify.com/admin"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
describe ShopifyClient::CustomCollection do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@custom_collection = ShopifyClient::CustomCollection.new({ :body_html => "<p>The best selling ipod ever</p>",
|
5
|
+
:handle => "ipods",
|
6
|
+
:id => 841564295,
|
7
|
+
:products_count => 1,
|
8
|
+
:image => {
|
9
|
+
:created_at => "2013-07-18T13:55:42-04:00",
|
10
|
+
:src => "http://cdn.shopify.com/s/files/1/0006/9093/3842/collections/ipod_nano_8gb.jpg"
|
11
|
+
}
|
12
|
+
})
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#handle" do
|
17
|
+
it "returns the collection's handle" do
|
18
|
+
@custom_collection.handle.must_equal 'ipods'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#image" do
|
23
|
+
it "returns a ShopifyClient::Image" do
|
24
|
+
@custom_collection.image.must_be_instance_of ShopifyClient::Image
|
25
|
+
end
|
26
|
+
describe "when image attribute is nil" do
|
27
|
+
before do
|
28
|
+
@custom_collection = ShopifyClient::CustomCollection.new({ :body_html => "<p>The best selling ipod ever</p>",
|
29
|
+
:handle => "ipods",
|
30
|
+
:id => 841564295,
|
31
|
+
:products_count => 1
|
32
|
+
})
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns nil" do
|
36
|
+
@custom_collection.image.must_be_nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe ShopifyClient::Error::ClientError do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "when status is 4xx" do
|
8
|
+
it "raises ShopifyClient::Error::ClientError" do
|
9
|
+
stub_request(:get, "https://example.myshopify.com/admin/shop.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 401, body: MultiJson.dump({ error: "Unauthorized" }) )
|
12
|
+
|
13
|
+
assert_raises ShopifyClient::Error::ClientError do
|
14
|
+
@client.shop
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe ShopifyClient::Error::ServerError do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@client = ShopifyClient.new("example.myshopify.com", "token")
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "when status is 4xx" do
|
8
|
+
it "raises ShopifyClient::Error::ServerError" do
|
9
|
+
stub_request(:get, "https://example.myshopify.com/admin/shop.json").
|
10
|
+
with(headers: { 'X-Shopify-Access-Token' => "token" }).
|
11
|
+
to_return(status: 500)
|
12
|
+
|
13
|
+
assert_raises ShopifyClient::Error::ServerError do
|
14
|
+
@client.shop
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe ShopifyClient::Order do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@order = ShopifyClient::Order.new({ :buyer_accepts_marketing => false,
|
5
|
+
:cancel_reason => nil,
|
6
|
+
:cancelled_at => nil,
|
7
|
+
:cart_token => "68778783ad298f1c80c3bafcddeea02f",
|
8
|
+
:checkout_token => nil,
|
9
|
+
:closed_at => nil,
|
10
|
+
:confirmed => false,
|
11
|
+
:created_at => "2008-01-10T11:00:00-05:00",
|
12
|
+
:currency => "USD",
|
13
|
+
:email => "bob.norman@hostmail.com",
|
14
|
+
:financial_status => "authorized",
|
15
|
+
:fulfillment_status => nil,
|
16
|
+
:gateway => "authorize_net",
|
17
|
+
:id => 450789469,
|
18
|
+
:landing_site => "http://www.example.com?source=abc"
|
19
|
+
})
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#financial_status" do
|
24
|
+
it "returns the order's financial_status" do
|
25
|
+
@order.financial_status.must_equal 'authorized'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|