shopify-mock 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile +4 -0
  5. data/README.rdoc +61 -0
  6. data/Rakefile +1 -0
  7. data/lib/shopify-mock.rb +37 -0
  8. data/lib/shopify-mock/fixtures.rb +41 -0
  9. data/lib/shopify-mock/fixtures/articles.json +30 -0
  10. data/lib/shopify-mock/fixtures/assets.json +136 -0
  11. data/lib/shopify-mock/fixtures/blogs.json +15 -0
  12. data/lib/shopify-mock/fixtures/collect.json +11 -0
  13. data/lib/shopify-mock/fixtures/comments.json +19 -0
  14. data/lib/shopify-mock/fixtures/count.json +3 -0
  15. data/lib/shopify-mock/fixtures/countries.json +16 -0
  16. data/lib/shopify-mock/fixtures/custom_collections.json +14 -0
  17. data/lib/shopify-mock/fixtures/customer_groups.json +25 -0
  18. data/lib/shopify-mock/fixtures/customers.json +32 -0
  19. data/lib/shopify-mock/fixtures/events.json +13 -0
  20. data/lib/shopify-mock/fixtures/fulfillments.json +35 -0
  21. data/lib/shopify-mock/fixtures/images.json +12 -0
  22. data/lib/shopify-mock/fixtures/metafields.json +14 -0
  23. data/lib/shopify-mock/fixtures/orders.json +141 -0
  24. data/lib/shopify-mock/fixtures/pages.json +16 -0
  25. data/lib/shopify-mock/fixtures/product_search_engines.json +8 -0
  26. data/lib/shopify-mock/fixtures/products.json +114 -0
  27. data/lib/shopify-mock/fixtures/provinces.json +100 -0
  28. data/lib/shopify-mock/fixtures/redirects.json +19 -0
  29. data/lib/shopify-mock/fixtures/script_tags.json +11 -0
  30. data/lib/shopify-mock/fixtures/shop.json +26 -0
  31. data/lib/shopify-mock/fixtures/smart_collections.json +21 -0
  32. data/lib/shopify-mock/fixtures/test.json +3 -0
  33. data/lib/shopify-mock/fixtures/themes.json +25 -0
  34. data/lib/shopify-mock/fixtures/transactions.json +13 -0
  35. data/lib/shopify-mock/fixtures/variants.json +84 -0
  36. data/lib/shopify-mock/fixtures/webhooks.json +12 -0
  37. data/lib/shopify-mock/responses.rb +17 -0
  38. data/lib/shopify-mock/responses/articles.rb +5 -0
  39. data/lib/shopify-mock/responses/orders.rb +6 -0
  40. data/lib/shopify-mock/urls.rb +7 -0
  41. data/lib/shopify-mock/version.rb +3 -0
  42. data/shopify-mock.gemspec +28 -0
  43. data/spec/mockify/fixtures_spec.rb +39 -0
  44. data/spec/mockify/responses/articles_spec.rb +25 -0
  45. data/spec/mockify/responses/orders_spec.rb +25 -0
  46. data/spec/spec_helper.rb +9 -0
  47. data/spec/support/fixture_support.rb +5 -0
  48. data/spec/support/http_support.rb +11 -0
  49. data/spec/support/url_support.rb +8 -0
  50. metadata +126 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format d
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ script: "rspec spec"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in shopify-mock.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,61 @@
1
+ = ShopifyMock
2
+
3
+ This gem is used for testing Shopify apps without having to actually connect to
4
+ Shopify to develop the application.
5
+
6
+ You can use this gem explicitely for testing, or you can also use it in your
7
+ development environment to speed things up when fiddling around in the web
8
+ browser, or in the console.
9
+
10
+ == Installation
11
+
12
+ Add the gem to your Gemfile in the appropriate group:
13
+
14
+ gem 'shopify-mock', :group => [:development, :test]
15
+
16
+ == Enabling / Disabling
17
+
18
+ For non Rails apps, ShopifyMock is disabled by default, and real-world Internet
19
+ access is allowed. In a Rails app, ShopifyMock is disabled except for in the :test
20
+ environment.
21
+
22
+ To enable / disable ShopifyMock manually, set ShopifyAPI::Mock.enabled to true or false:
23
+
24
+ ShopifyAPI::Mock.enabled = true # or false
25
+
26
+ And to completely disable access to the Internet altogether, or re-enable it:
27
+
28
+ ShopifyAPI::Mock.allow_internet = false # or true to re-enable
29
+
30
+ == Example
31
+
32
+ After installing the gem in your Shopify app, load the rails console, and try
33
+ this quick example:
34
+
35
+ rails c
36
+ :001 > ShopifyAPI::Mock.enabled = true
37
+ :002 > order = ShopifyAPI::Session("test", "randomtoken") { ShopifyAPI::Order.first }
38
+
39
+ You'll notice that the order was not downloaded from Shopify, but based off of
40
+ a ShopifyMock fixture found in lib/shopify-mock/fixtures/orders.json
41
+
42
+ == Fixtures
43
+
44
+ You have access to the ShopifyMock fixtures from within your app to help with
45
+ testing. To access a fixture, use ShopifyAPI::Mock::Fixtures:
46
+
47
+ ShopifyAPI::Mock::Fixtures.read(:orders) # => contents of orders.json
48
+
49
+ You can also use your own fixtures if you'd like:
50
+
51
+ ShopifyAPI::Mock::Fixtures.use :orders, order.to_json # => use custom content for :orders
52
+ ShopifyAPI::Mock::Fixtures.use :orders, :default # => reset :orders to default fixture
53
+ ShopifyAPI::Mock::Fixtures.reset # => reset all the fixtures back to their defaults
54
+
55
+ Or, if you'd prefer you can point the entire fixture path to a different location:
56
+
57
+ ShopifyAPI::Mock::Fixtures.path = File.join(Rails.root, 'spec', 'fixtures')
58
+
59
+
60
+ All of the default fixtures are copied directly from the
61
+ {Shopify API}[http://api.shopify.com]
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,37 @@
1
+ require 'fakeweb'
2
+
3
+ require 'shopify-mock/version'
4
+ require 'shopify-mock/urls'
5
+ require 'shopify-mock/fixtures'
6
+
7
+ module ShopifyAPI
8
+ module Mock
9
+ class << self
10
+ def enabled
11
+ @enabled || false
12
+ end
13
+
14
+ def enabled=(value=false)
15
+ return @enabled if value == @enabled
16
+ if value
17
+ load File.expand_path("../shopify-mock/responses.rb", __FILE__)
18
+ else
19
+ FakeWeb.clean_registry
20
+ end
21
+ @enabled = value
22
+ end
23
+
24
+ def allow_internet
25
+ @allow_internet || true
26
+ end
27
+
28
+ def allow_internet=(state = true)
29
+ return @allow_internet if @allow_internet == state
30
+ @allow_internet = state
31
+ FakeWeb.allow_net_connect = @allow_internet
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ ShopifyAPI::Mock.enable if defined?(Rails) && Rails.env.test?
@@ -0,0 +1,41 @@
1
+ module ShopifyAPI
2
+ module Mock
3
+ class Fixtures
4
+ @cache = {}
5
+
6
+ class << self
7
+
8
+ def read(name, ext = :json)
9
+ fixture_name = "#{name.to_s}.#{ext.to_s}"
10
+ fixture = File.join(self.path, fixture_name)
11
+ raise "invalid fixture name" unless File.exists? fixture
12
+ @cache[fixture_name] = File.read(fixture) unless @cache.include? fixture_name
13
+ @cache[fixture_name]
14
+ end
15
+
16
+ def use(name, content)
17
+ name = "#{name}.json"
18
+ if content == :default
19
+ @cache.delete name if @cache.include? name
20
+ else
21
+ @cache[name] = content
22
+ end
23
+ end
24
+
25
+ def path
26
+ @path ||= File.expand_path("../fixtures/", __FILE__)
27
+ end
28
+
29
+ def path=(value)
30
+ @path = value
31
+ end
32
+
33
+ def reset
34
+ @cache = {}
35
+ @path = nil
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ {
2
+ "articles": [
3
+ {
4
+ "created_at": "2008-12-31T19:00:00-05:00",
5
+ "body_html": "I have no idea what to write about, but it's going to rock!",
6
+ "title": "Some crazy article I'm coming up with",
7
+ "author": "John",
8
+ "updated_at": "2009-01-31T19:00:00-05:00",
9
+ "summary_html": null,
10
+ "blog_id": 241253187,
11
+ "tags": "Mystery",
12
+ "id": 989034056,
13
+ "user_id": null,
14
+ "published_at": null
15
+ },
16
+ {
17
+ "created_at": "2008-07-31T20:00:00-04:00",
18
+ "body_html": "<p>Do <em>you</em> have an <strong>IPod</strong> yet?</p>",
19
+ "title": "get on the train now",
20
+ "author": "Dennis",
21
+ "updated_at": "2008-07-31T20:00:00-04:00",
22
+ "summary_html": null,
23
+ "blog_id": 241253187,
24
+ "tags": "Announcing",
25
+ "id": 134645308,
26
+ "user_id": 799407056,
27
+ "published_at": "2008-07-31T20:00:00-04:00"
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,136 @@
1
+ {
2
+ "assets": [
3
+ {
4
+ "created_at": "2010-07-12T15:31:50-04:00",
5
+ "updated_at": "2010-07-12T15:31:50-04:00",
6
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-body-green.gif?1",
7
+ "key": "assets/bg-body-green.gif"
8
+ },
9
+ {
10
+ "created_at": "2010-07-12T15:31:50-04:00",
11
+ "updated_at": "2010-07-12T15:31:50-04:00",
12
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-body-orange.gif?1",
13
+ "key": "assets/bg-body-orange.gif"
14
+ },
15
+ {
16
+ "created_at": "2010-07-12T15:31:50-04:00",
17
+ "updated_at": "2010-07-12T15:31:50-04:00",
18
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-body-pink.gif?1",
19
+ "key": "assets/bg-body-pink.gif"
20
+ },
21
+ {
22
+ "created_at": "2010-07-12T15:31:50-04:00",
23
+ "updated_at": "2010-07-12T15:31:50-04:00",
24
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-body.gif?1",
25
+ "key": "assets/bg-body.gif"
26
+ },
27
+ {
28
+ "created_at": "2010-07-12T15:31:50-04:00",
29
+ "updated_at": "2010-07-12T15:31:50-04:00",
30
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-content.gif?1",
31
+ "key": "assets/bg-content.gif"
32
+ },
33
+ {
34
+ "created_at": "2010-07-12T15:31:50-04:00",
35
+ "updated_at": "2010-07-12T15:31:50-04:00",
36
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-footer.gif?1",
37
+ "key": "assets/bg-footer.gif"
38
+ },
39
+ {
40
+ "created_at": "2010-07-12T15:31:50-04:00",
41
+ "updated_at": "2010-07-12T15:31:50-04:00",
42
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-main.gif?1",
43
+ "key": "assets/bg-main.gif"
44
+ },
45
+ {
46
+ "created_at": "2010-07-12T15:31:50-04:00",
47
+ "updated_at": "2010-07-12T15:31:50-04:00",
48
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/bg-sidebar.gif?1",
49
+ "key": "assets/bg-sidebar.gif"
50
+ },
51
+ {
52
+ "created_at": "2010-07-12T15:31:50-04:00",
53
+ "updated_at": "2010-07-12T15:31:50-04:00",
54
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/shop.css?1",
55
+ "key": "assets/shop.css"
56
+ },
57
+ {
58
+ "created_at": "2010-07-12T15:31:50-04:00",
59
+ "updated_at": "2010-07-12T15:31:50-04:00",
60
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/shop.css.liquid?1",
61
+ "key": "assets/shop.css.liquid"
62
+ },
63
+ {
64
+ "created_at": "2010-07-12T15:31:50-04:00",
65
+ "updated_at": "2010-07-12T15:31:50-04:00",
66
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/shop.js?1",
67
+ "key": "assets/shop.js"
68
+ },
69
+ {
70
+ "created_at": "2010-07-12T15:31:50-04:00",
71
+ "updated_at": "2010-07-12T15:31:50-04:00",
72
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/sidebar-devider.gif?1",
73
+ "key": "assets/sidebar-devider.gif"
74
+ },
75
+ {
76
+ "created_at": "2010-07-12T15:31:50-04:00",
77
+ "updated_at": "2010-07-12T15:31:50-04:00",
78
+ "public_url": "http://static.shopify.com/s/files/1/6909/3384/t/1/assets/sidebar-menu.jpg?1",
79
+ "key": "assets/sidebar-menu.jpg"
80
+ },
81
+ {
82
+ "created_at": "2010-07-12T15:31:50-04:00",
83
+ "updated_at": "2010-07-12T15:31:50-04:00",
84
+ "public_url": null,
85
+ "key": "config/settings.html"
86
+ },
87
+ {
88
+ "created_at": "2010-07-12T15:31:50-04:00",
89
+ "updated_at": "2010-07-12T15:31:50-04:00",
90
+ "public_url": null,
91
+ "key": "layout/theme.liquid"
92
+ },
93
+ {
94
+ "created_at": "2010-07-12T15:31:50-04:00",
95
+ "updated_at": "2010-07-12T15:31:50-04:00",
96
+ "public_url": null,
97
+ "key": "templates/article.liquid"
98
+ },
99
+ {
100
+ "created_at": "2010-07-12T15:31:50-04:00",
101
+ "updated_at": "2010-07-12T15:31:50-04:00",
102
+ "public_url": null,
103
+ "key": "templates/blog.liquid"
104
+ },
105
+ {
106
+ "created_at": "2010-07-12T15:31:50-04:00",
107
+ "updated_at": "2010-07-12T15:31:50-04:00",
108
+ "public_url": null,
109
+ "key": "templates/cart.liquid"
110
+ },
111
+ {
112
+ "created_at": "2010-07-12T15:31:50-04:00",
113
+ "updated_at": "2010-07-12T15:31:50-04:00",
114
+ "public_url": null,
115
+ "key": "templates/collection.liquid"
116
+ },
117
+ {
118
+ "created_at": "2010-07-12T15:31:50-04:00",
119
+ "updated_at": "2010-07-12T15:31:50-04:00",
120
+ "public_url": null,
121
+ "key": "templates/index.liquid"
122
+ },
123
+ {
124
+ "created_at": "2010-07-12T15:31:50-04:00",
125
+ "updated_at": "2010-07-12T15:31:50-04:00",
126
+ "public_url": null,
127
+ "key": "templates/page.liquid"
128
+ },
129
+ {
130
+ "created_at": "2010-07-12T15:31:50-04:00",
131
+ "updated_at": "2010-07-12T15:31:50-04:00",
132
+ "public_url": null,
133
+ "key": "templates/product.liquid"
134
+ }
135
+ ]
136
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "blogs": [
3
+ {
4
+ "handle": "apple-blog",
5
+ "created_at": "2011-09-06T11:46:12-04:00",
6
+ "title": "Mah Blog",
7
+ "template_suffix": null,
8
+ "updated_at": "2006-02-01T19:00:00-05:00",
9
+ "feedburner_location": null,
10
+ "id": 241253187,
11
+ "feedburner": null,
12
+ "commentable": "no"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "collect": {
3
+ "position": 2,
4
+ "created_at": "2011-09-06T11:47:03-04:00",
5
+ "product_id": 921728736,
6
+ "updated_at": "2011-09-06T11:47:03-04:00",
7
+ "featured": false,
8
+ "id": 1012587613,
9
+ "collection_id": 841564295
10
+ }
11
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "comments": [
3
+ {
4
+ "created_at": "2011-09-06T11:46:12-04:00",
5
+ "body_html": "<p>Hi author, I really <em>like</em> what you're doing there.</p>",
6
+ "body": "Hi author, I really _like_ what you're doing there.",
7
+ "author": "Soleone",
8
+ "updated_at": "2011-09-06T11:46:12-04:00",
9
+ "blog_id": 241253187,
10
+ "id": 653537639,
11
+ "article_id": 134645308,
12
+ "ip": "127.0.0.1",
13
+ "user_agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1",
14
+ "published_at": null,
15
+ "status": "unapproved",
16
+ "email": "sole@one.de"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "count": 1
3
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "countries": [
3
+ {
4
+ "tax": 0.05,
5
+ "name": "Canada",
6
+ "code": "CA",
7
+ "id": 879921427
8
+ },
9
+ {
10
+ "tax": 0.15,
11
+ "name": "Colombia",
12
+ "code": "CO",
13
+ "id": 359115488
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "custom_collections": [
3
+ {
4
+ "handle": "ipods",
5
+ "body_html": "<p>The best selling ipod ever</p>",
6
+ "title": "IPods",
7
+ "template_suffix": null,
8
+ "updated_at": "2008-02-01T19:00:00-05:00",
9
+ "sort_order": "manual",
10
+ "id": 841564295,
11
+ "published_at": "2008-02-01T19:00:00-05:00"
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "customer_groups": [
3
+ {
4
+ "name": "Accepts Marketing",
5
+ "created_at": "2011-08-30T07:46:11-04:00",
6
+ "updated_at": "2011-08-30T07:46:11-04:00",
7
+ "id": 789629109,
8
+ "query": "accepts_marketing:1"
9
+ },
10
+ {
11
+ "name": "Canadian Snowboarders",
12
+ "created_at": "2011-08-30T07:46:11-04:00",
13
+ "updated_at": "2011-08-30T07:46:11-04:00",
14
+ "id": 20610973,
15
+ "query": "location:Canada"
16
+ },
17
+ {
18
+ "name": "Premier Customers",
19
+ "created_at": "2011-08-30T07:46:11-04:00",
20
+ "updated_at": "2011-08-30T07:46:11-04:00",
21
+ "id": 669439218,
22
+ "query": "John Smith orders_count:>10 total_spent:>100.00"
23
+ }
24
+ ]
25
+ }