solidus_seo 1.0.10 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d8a42d95a51eeb5b6c4860cda59a6e2bb2c7cb4f575da29ea75b4a1fb729e96
4
- data.tar.gz: 22608d6f08eabbfc97b70b9650a96b16c4f79cf1674b3751f3fe650a8d6827c5
3
+ metadata.gz: beb1033fb7f4c045f1f04ea722bcc18b6e2eca0a2d439ccd770405cfe9b2c975
4
+ data.tar.gz: 9af5e2eccfcd86fe5e1b58ac64753082d7d5ec0554534e0bf4ad58f6575f997c
5
5
  SHA512:
6
- metadata.gz: ab4aa4274b86aca434eb398bf144eef576632bdf7c5afabe777abfc6091d852b04cef095fc9d6992d71e815043f4fa52e23de8bdff9bc79bd0fb62512f395c26
7
- data.tar.gz: 6ee6fadcea36ed37c9f821310566c5e8f92e25401098b2390c3a3a8eb290042550f683098d020be587f0ef21f187fc8837904b54b5ec063a98aee28af17db601
6
+ metadata.gz: bf61b372e03d5c2e5858771993534722cae657cc7354887454d34cd57f49e439f83afe6678e286f57c9603d5a9cbe22a2c77d4dce3459987962c72287799d3b9
7
+ data.tar.gz: 13643cee45aef5965a2a1bbe346494f07efd3feb81baea9f9edebb43e045aa915a4430cc900356aad3c36a39b9173cd42389386393a14369bf4b7b883ef3005a
data/README.md CHANGED
@@ -45,8 +45,10 @@ Here are the changes we make, via deface, in the default Solidus views as part o
45
45
 
46
46
  - In `spree/layouts/spree_application.html.erb`
47
47
  - Insert `<%= render 'solidus_seo/analytics' %>` just before `</head>`.
48
+ - Insert `<%= render 'solidus_seo/noscript_tags' %>` immediately after the `<body>` opening tag.
48
49
  - Insert `<%= dump_jsonld %>` just before the `</body>` closing tag.
49
50
  - Replace `<%= taxon_breadcrumbs(@taxon) %>` with (`<%= taxon_breadcrumbs_jsonld(@taxon) %>`) which does the same as the original plus prints a JSON-LD tag.
51
+ - Replace `<%= flash_messages %>` with (`<%= flash_messages(ignore_types: 'added_to_cart') %>`) which does the same as the original plus prints a JSON-LD tag.
50
52
 
51
53
  - In `spree/products/show.html.erb`:
52
54
  - Insert `<%= jsonld @product %>` anywhere inside the `cache` block.
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module CheckoutControllerDecorator
5
+ def self.prepended(base)
6
+ base.class_eval do
7
+ end
8
+ end
9
+
10
+ def before_address
11
+ flash[:checkout_initiated] =
12
+ @order.address? &&
13
+ request.referrer =~ /#{cart_path}\b/i &&
14
+ params[:action] == 'edit'
15
+
16
+ super
17
+ end
18
+
19
+ private
20
+
21
+ ::Spree::StoreController.prepend(self)
22
+ end
23
+ end
@@ -17,10 +17,10 @@ module Spree
17
17
  end
18
18
 
19
19
  def seo_images
20
- return [] unless display_image.attachment.file?
20
+ return [] unless gallery.images.any? && gallery.images.first.attachment.file?
21
21
 
22
22
  [
23
- url_helper.image_url(display_image.attachment.url(:large), host: store_host),
23
+ url_helper.image_url(gallery.images.first.attachment.url(:large), host: store_host),
24
24
  ].compact
25
25
  end
26
26
 
@@ -1,25 +1,56 @@
1
1
  <%
2
2
  return if ENV['FACEBOOK_PIXEL_ID'].blank?
3
3
 
4
- if just_purchased
5
- order_data = {
6
- value: order.total,
7
- currency: order.currency,
4
+ event_data = {}
5
+
6
+ if order.present?
7
+ if just_purchased
8
+ event_data[:order] = {
9
+ value: order.total,
10
+ currency: order.currency,
11
+ content_type: 'product',
12
+ contents: order.line_items.map do |line_item|
13
+ { id: line_item.variant.sku, quantity: line_item.quantity }
14
+ end,
15
+
16
+ # custom properties
17
+ order_number: order.number,
18
+ item_total: order.item_total,
19
+ tax_total: order.tax_total,
20
+ ship_total: order.ship_total,
21
+ promo_total: order.promo_total
22
+ }
23
+ end
24
+
25
+ if flash[:added_to_cart].present?
26
+ event_data[:added_to_cart] = {
27
+ currency: order.currency,
28
+ content_type: 'product',
29
+ contents: flash[:added_to_cart].map do |variant_sku, variant|
30
+ { id: variant_sku, quantity: variant['quantity'] }
31
+ end
32
+ }
33
+ end
34
+
35
+ if flash[:checkout_initiated].present?
36
+ event_data[:checkout_initiated] = {
37
+ value: order.total,
38
+ currency: order.currency,
39
+ contents: order.line_items.map do |line_item|
40
+ { id: line_item.variant.sku, quantity: line_item.quantity }
41
+ end
42
+ }
43
+ end
44
+ end
45
+
46
+ if @product
47
+ event_data[:current_product] = {
8
48
  content_type: 'product',
9
- contents: order.line_items.map do |line_item|
10
- next unless line_item.variant
11
-
12
- { id: line_item.variant.sku, quantity: line_item.quantity }
13
- end.compact,
14
-
15
- # custom properties
16
- order_number: order.number,
17
- item_total: order.item_total,
18
- tax_total: order.tax_total,
19
- ship_total: order.ship_total,
20
- promo_total: order.promo_total
49
+ content_name: @product.name,
50
+ content_ids: [@product.master.sku]
21
51
  }
22
52
  end
53
+
23
54
  %>
24
55
  <script type="text/javascript" data-tag="facebook">
25
56
  !function(f,b,e,v,n,t,s) {if (f.fbq) return;n = f.fbq = function() { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments) };if (!f._fbq) f._fbq=n;n.push = n; n.loaded = !0; n.version = '2.0'; n.queue=[]; t = b.createElement(e); t.async = !0; t.src = v;s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s);}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js');
@@ -27,10 +58,25 @@ end
27
58
  fbq('init', '<%= ENV['FACEBOOK_PIXEL_ID'] %>');
28
59
  fbq('track', 'PageView');
29
60
 
30
- <% if just_purchased %>
31
- fbq('track', 'Purchase', <%== order_data.to_json %>);
61
+ <% if event_data[:order].present? %>
62
+ fbq('track', 'Purchase', <%== event_data[:order].to_json %>);
32
63
  window.solidusSeoDataLayer('facebook', 'purchase');
33
64
  <% end %>
65
+
66
+ <% if event_data[:added_to_cart].present? %>
67
+ fbq('track', 'AddToCart', <%== event_data[:added_to_cart].to_json %>);
68
+ window.solidusSeoDataLayer('facebook', 'addtocart');
69
+ <% end %>
70
+
71
+ <% if event_data[:checkout_initiated].present? %>
72
+ fbq('track', 'InitiateCheckout', <%== event_data[:checkout_initiated].to_json %>);
73
+ window.solidusSeoDataLayer('facebook', 'initiatecheckout');
74
+ <% end %>
75
+
76
+ <% if event_data[:current_product].present? %>
77
+ fbq('track', 'ViewContent', <%== event_data[:current_product].to_json %>);
78
+ window.solidusSeoDataLayer('facebook', 'viewcontent');
79
+ <% end %>
34
80
  </script>
35
81
  <noscript>
36
82
  <img height="1" width="1" src="https://www.facebook.com/tr?id=<%= ENV['FACEBOOK_PIXEL_ID'] %>&ev=PageView&noscript=1" />
@@ -1,13 +1,13 @@
1
1
  <%
2
2
  return if ENV['GOOGLE_TAG_MANAGER_ID'].present? || ENV['GOOGLE_ANALYTICS_ID'].blank?
3
3
 
4
+ event_data = {}
5
+
4
6
  if just_purchased
5
- order_data = {
7
+ event_data[:order] = {
6
8
  transaction_id: order.number,
7
9
  value: order.total,
8
10
  items: order.line_items.map do |line_item|
9
- next unless line_item.variant
10
-
11
11
  {
12
12
  id: line_item.variant.sku,
13
13
  name: line_item.variant.name,
@@ -15,7 +15,7 @@ if just_purchased
15
15
  variant: line_item.variant.options_text,
16
16
  quantity: line_item.quantity
17
17
  }
18
- end.compact,
18
+ end,
19
19
 
20
20
  affiliation: current_store.name,
21
21
  currency: order.currency,
@@ -25,16 +25,17 @@ if just_purchased
25
25
  end
26
26
  %>
27
27
  <script async src="https://www.googletagmanager.com/gtag/js?id=<%= ENV['GOOGLE_ANALYTICS_ID'] %>"></script>
28
- <script type="text/javascript" data-tag="google-analytics">
29
- window.dataLayer = window.dataLayer || [];
30
-
31
- function gtag(){ dataLayer.push(arguments); }
28
+ <script>
29
+ window.dataLayer = window.dataLayer || [];
30
+ function gtag(){dataLayer.push(arguments);}
31
+ gtag('js', new Date());
32
32
 
33
- gtag('js', new Date());
34
- gtag('config', '<%= ENV['GOOGLE_ANALYTICS_ID'] %>');
35
-
36
- <% if just_purchased %>
37
- gtag('event', 'purchase', <%== order_data.to_json %>);
38
- window.solidusSeoDataLayer('google-analytics', 'purchase');
39
- <% end %>
33
+ gtag('config', '<%= ENV['GOOGLE_ANALYTICS_ID'] %>');
40
34
  </script>
35
+
36
+ <% if just_purchased %>
37
+ <script data-tag="google-analytics">
38
+ gtag('event', 'purchase', <%== event_data[:order].to_json %>);
39
+ window.solidusSeoDataLayer('google-analytics', 'purchase');
40
+ </script>
41
+ <% end %>
@@ -1,11 +1,13 @@
1
1
  <%
2
2
  return if ENV['GOOGLE_ANALYTICS_ID'].present? || ENV['GOOGLE_TAG_MANAGER_ID'].blank?
3
3
 
4
+ event_data = {}
5
+
4
6
  if just_purchased
5
- order_data = {
7
+ event_data[:order] = {
6
8
  id: order.number,
7
9
  revenue: order.total,
8
- coupon: '', # TODO: Add coupon code if present
10
+ coupon: order.adjustments.promotion.first&.promotion_code&.value,
9
11
 
10
12
  affiliation: current_store.name,
11
13
  currency: order.currency,
@@ -13,9 +15,7 @@ if just_purchased
13
15
  shipping: order.ship_total
14
16
  }
15
17
 
16
- purchased_items = order.line_items.map do |line_item|
17
- next unless line_item.variant
18
-
18
+ event_data[:order_contents] = order.line_items.map do |line_item|
19
19
  {
20
20
  id: line_item.variant.sku,
21
21
  name: line_item.variant.name,
@@ -23,28 +23,29 @@ if just_purchased
23
23
  variant: line_item.variant.options_text,
24
24
  quantity: line_item.quantity
25
25
  }
26
- end.compact
26
+ end
27
27
  end
28
28
  %>
29
29
  <script type="text/javascript" data-tag="google-tag-manager">
30
- window.dataLayer = window.dataLayer || [];
31
-
32
- <% if just_purchased %>
33
- window.dataLayer.push({
34
- 'ecommerce': {
35
- 'purchase': {
36
- 'actionField': <%== order_data.to_json %>,
37
- 'products': <%== purchased_items.to_json %>
38
- }
39
- }
40
- });
30
+ window.dataLayer = window.dataLayer || [];
41
31
 
42
- window.solidusSeoDataLayer('google-tag-manager', 'purchase');
43
- <% end %>
32
+ <% if just_purchased %>
33
+ window.dataLayer.push({
34
+ 'ecommerce': {
35
+ 'purchase': {
36
+ 'actionField': <%== event_data[:order].to_json %>,
37
+ 'products': <%== event_data[:order_contents].to_json %>
38
+ }
39
+ }
40
+ });
44
41
 
45
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
42
+ window.solidusSeoDataLayer('google-tag-manager', 'purchase');
43
+ <% end %>
44
+ </script>
45
+ <script>
46
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
46
47
  new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
47
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
48
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
49
- })(window,document,'script','dataLayer','<%= ENV['GOOGLE_TAG_MANAGER_ID'] %>');
48
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
49
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
50
+ })(window,document,'script','dataLayer','<%= ENV['GOOGLE_TAG_MANAGER_ID'] %>');
50
51
  </script>
@@ -0,0 +1,7 @@
1
+ <%
2
+ return if ENV['GOOGLE_TAG_MANAGER_ID'].blank?
3
+ %>
4
+ <!-- Google Tag Manager (noscript) -->
5
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=<%= ENV['GOOGLE_TAG_MANAGER_ID'] %>"
6
+ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
7
+ <!-- End Google Tag Manager (noscript) -->
@@ -1,38 +1,55 @@
1
1
  <%
2
2
  return if ENV['PINTEREST_TAG_ID'].blank?
3
3
 
4
- product_data = {}
5
- add_to_cart_data = {}
6
- order_data = {}
7
- em_data = {}
4
+ event_data = {}
8
5
 
9
6
  user_email = try_spree_current_user&.email || current_order&.email
10
7
  if user_email.present?
11
8
  em_data = { em: user_email }
12
9
  end
13
10
 
14
- if just_purchased
15
- order_data = {
16
- value: order.total,
17
- currency: order.currency,
18
- order_quantity: order.line_items.sum(&:quantity),
19
- line_items: order.line_items.map do |line_item|
20
- next unless line_item.variant
11
+ if order.present?
12
+ if just_purchased
13
+ event_data[:order] = {
14
+ value: order.total,
15
+ currency: order.currency,
16
+ order_quantity: order.line_items.sum(&:quantity),
17
+ line_items: order.line_items.map do |line_item|
18
+ next unless line_item.variant
21
19
 
22
- {
23
- product_id: line_item.variant.product.master.sku,
24
- product_name: line_item.variant.name,
25
- product_variant_id: line_item.variant.sku,
26
- product_variant: line_item.variant.options_text,
27
- product_quantity: line_item.quantity,
28
- product_price: line_item.price
29
- }
30
- end.compact
31
- }
20
+ {
21
+ product_id: line_item.variant.product.master.sku,
22
+ product_name: line_item.variant.name,
23
+ product_variant_id: line_item.variant.sku,
24
+ product_variant: line_item.variant.options_text,
25
+ product_quantity: line_item.quantity,
26
+ product_price: line_item.price
27
+ }
28
+ end.compact
29
+ }
30
+ end
31
+
32
+ if flash[:added_to_cart].present?
33
+ event_data[:added_to_cart] = {
34
+ value: order.total,
35
+ currency: order.currency,
36
+ order_id: order.number,
37
+ line_items: flash[:added_to_cart].map do |variant_sku, variant|
38
+ {
39
+ product_id: variant['id'],
40
+ product_name: variant['name'],
41
+ product_variant_id: variant_sku,
42
+ product_variant: variant['variant'],
43
+ product_price: variant['price'],
44
+ product_quantity: variant['quantity']
45
+ }
46
+ end
47
+ }
48
+ end
32
49
  end
33
50
 
34
51
  if @product
35
- product_data = {
52
+ event_data[:product] = {
36
53
  line_items: [
37
54
  {
38
55
  product_name: @product.name,
@@ -42,23 +59,7 @@ if @product
42
59
  }
43
60
  end
44
61
 
45
- if flash[:added_to_cart].present?
46
- add_to_cart_data = {
47
- value: order.total,
48
- currency: order.currency,
49
- order_id: order.number,
50
- line_items: flash[:added_to_cart].map do |variant_sku, variant|
51
- {
52
- product_id: variant['id'],
53
- product_name: variant['name'],
54
- product_variant_id: variant_sku,
55
- product_variant: variant['variant'],
56
- product_price: variant['price'],
57
- product_quantity: variant['quantity']
58
- }
59
- end
60
- }
61
- end
62
+
62
63
  %>
63
64
  <script type="text/javascript" data-tag="pinterest">
64
65
  !function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push(Array.prototype.slice.call(arguments))};var n=window.pintrk;n.queue=[],n.version="3.0";var t=document.createElement("script");t.async=!0,t.src=e;var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r)}}("https://s.pinimg.com/ct/core.js");
@@ -66,16 +67,16 @@ end
66
67
  pintrk('load', '<%= ENV['PINTEREST_TAG_ID'] %>' <%== em_data.present? ? ", #{em_data.to_json}" : '' %>);
67
68
  pintrk('page');
68
69
 
69
- pintrk('track', 'pagevisit'<%== product_data.present? ? ", #{product_data.to_json}" : '' %>);
70
+ pintrk('track', 'pagevisit'<%== event_data[:product].present? ? ", #{event_data[:product].to_json}" : '' %>);
70
71
  window.solidusSeoDataLayer('pinterest', 'pagevisit');
71
72
 
72
- <% if add_to_cart_data.present? %>
73
- pintrk('track', 'addtocart', <%== add_to_cart_data.to_json %>);
73
+ <% if event_data[:added_to_cart].present? %>
74
+ pintrk('track', 'addtocart', <%== event_data[:added_to_cart].to_json %>);
74
75
  window.solidusSeoDataLayer('pinterest', 'addtocart');
75
76
  <% end %>
76
77
 
77
- <% if order_data.present? %>
78
- pintrk('track', 'checkout', <%== order_data.to_json %>);
78
+ <% if event_data[:order].present? %>
79
+ pintrk('track', 'checkout', <%== event_data[:order].to_json %>);
79
80
  window.solidusSeoDataLayer('pinterest', 'purchase');
80
81
  <% end %>
81
82
  </script>
@@ -35,6 +35,8 @@ module SolidusSeo
35
35
  copy_file 'insert_product_list_helper.html.erb.deface', 'app/overrides/spree/shared/_products/insert_product_list_helper.html.erb.deface'
36
36
  copy_file 'insert_analytics_in_layout.html.erb.deface', 'app/overrides/spree/layouts/spree_application/insert_analytics_in_layout.html.erb.deface'
37
37
  copy_file 'replace_taxon_breadcrumbs_helper.html.erb.deface', 'app/overrides/spree/layouts/spree_application/replace_taxon_breadcrumbs_helper.html.erb.deface'
38
+ copy_file 'insert_noscript_tags.html.erb.deface', 'app/overrides/spree/layouts/spree_application/insert_noscript_tags.html.erb.deface'
39
+ copy_file 'replace_flash_messages_helper.html.erb.deface', 'app/overrides/spree/layouts/spree_application/replace_flash_messages_helper.html.erb.deface'
38
40
  end
39
41
  end
40
42
  end
@@ -0,0 +1,4 @@
1
+ <!--
2
+ insert_top "body"
3
+ -->
4
+ <%= render 'solidus_seo/noscript_tags' %>
@@ -0,0 +1,5 @@
1
+ <!--
2
+ replace %{erb[loud]:contains("flash_messages")}
3
+ original "<%= flash_messages %>"
4
+ -->
5
+ <%= flash_messages(ignore_types: 'added_to_cart') %>
@@ -43,7 +43,7 @@ module SolidusSeo
43
43
  end
44
44
 
45
45
  def jsonld_fetch(type = :base, items = nil, opts = {})
46
- force = opts.extract!(:force) || false
46
+ force = opts.delete(:force) || false
47
47
 
48
48
  jsonld_cache_key = [:jsonld, items, *opts.values].compact
49
49
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusSeo
4
- VERSION = '1.0.10'
4
+ VERSION = '1.1.0'
5
5
  end
data/spec/examples.txt CHANGED
@@ -1,32 +1,40 @@
1
- example_id | status | run_time |
2
- ------------------------------------------------ | ------ | --------------- |
3
- ./spec/features/add_to_cart_spec.rb[1:1:1] | passed | 1.83 seconds |
4
- ./spec/features/checkout_complete_spec.rb[1:1:1] | passed | 0.5577 seconds |
5
- ./spec/features/checkout_complete_spec.rb[1:2:1] | passed | 4.04 seconds |
6
- ./spec/features/checkout_complete_spec.rb[1:3:1] | passed | 0.80112 seconds |
7
- ./spec/features/checkout_complete_spec.rb[1:4:1] | passed | 0.61828 seconds |
8
- ./spec/features/homepage_spec.rb[1:1:1] | passed | 0.25538 seconds |
9
- ./spec/features/homepage_spec.rb[1:1:2] | passed | 0.29293 seconds |
10
- ./spec/features/homepage_spec.rb[1:2:1] | passed | 0.22449 seconds |
11
- ./spec/features/homepage_spec.rb[1:2:2] | passed | 0.32462 seconds |
12
- ./spec/features/homepage_spec.rb[1:3:1] | passed | 0.21716 seconds |
13
- ./spec/features/homepage_spec.rb[1:3:2] | passed | 0.19521 seconds |
14
- ./spec/features/product_page_spec.rb[1:1:1] | passed | 0.357 seconds |
15
- ./spec/features/product_page_spec.rb[1:1:2] | passed | 0.3146 seconds |
16
- ./spec/features/product_page_spec.rb[1:1:3] | passed | 0.30766 seconds |
17
- ./spec/features/product_page_spec.rb[1:2:1] | passed | 0.42866 seconds |
18
- ./spec/features/product_page_spec.rb[1:2:2:1] | passed | 0.32146 seconds |
19
- ./spec/features/product_page_spec.rb[1:2:3:1] | passed | 0.34169 seconds |
20
- ./spec/features/product_page_spec.rb[1:3:1] | passed | 3.69 seconds |
21
- ./spec/features/product_page_spec.rb[1:3:2] | passed | 0.33422 seconds |
22
- ./spec/features/product_page_spec.rb[1:3:3] | passed | 0.35778 seconds |
23
- ./spec/features/product_page_spec.rb[1:4:1:1] | passed | 0.83177 seconds |
24
- ./spec/features/taxon_page_spec.rb[1:1:1] | passed | 0.37527 seconds |
25
- ./spec/features/taxon_page_spec.rb[1:1:2] | passed | 0.34972 seconds |
26
- ./spec/features/taxon_page_spec.rb[1:1:3] | passed | 0.34283 seconds |
27
- ./spec/features/taxon_page_spec.rb[1:2:1] | passed | 0.43213 seconds |
28
- ./spec/features/taxon_page_spec.rb[1:2:2:1] | passed | 0.48963 seconds |
29
- ./spec/features/taxon_page_spec.rb[1:2:3:1] | passed | 0.3796 seconds |
30
- ./spec/features/taxon_page_spec.rb[1:3:1] | passed | 0.44923 seconds |
31
- ./spec/features/taxon_page_spec.rb[1:3:2] | passed | 0.35334 seconds |
32
- ./spec/features/taxon_page_spec.rb[1:4:1] | passed | 0.62911 seconds |
1
+ example_id | status | run_time |
2
+ ------------------------------------------------- | ------- | --------------- |
3
+ ./spec/features/add_to_cart_spec.rb[1:1:1] | passed | 0.88876 seconds |
4
+ ./spec/features/add_to_cart_spec.rb[1:2:1] | passed | 1.67 seconds |
5
+ ./spec/features/add_to_cart_spec.rb[1:2:2] | passed | 0.81532 seconds |
6
+ ./spec/features/checkout_complete_spec.rb[1:1:1] | passed | 0.49475 seconds |
7
+ ./spec/features/checkout_complete_spec.rb[1:2:1] | passed | 0.63596 seconds |
8
+ ./spec/features/checkout_complete_spec.rb[1:3:1] | passed | 0.4408 seconds |
9
+ ./spec/features/checkout_complete_spec.rb[1:4:1] | passed | 0.54652 seconds |
10
+ ./spec/features/checkout_initiated_spec.rb[1:1:1] | pending | 1.46 seconds |
11
+ ./spec/features/checkout_initiated_spec.rb[1:2:1] | pending | 0.11918 seconds |
12
+ ./spec/features/checkout_initiated_spec.rb[1:3:1] | passed | 3.12 seconds |
13
+ ./spec/features/checkout_initiated_spec.rb[1:4:1] | pending | 0.1185 seconds |
14
+ ./spec/features/homepage_spec.rb[1:1:1] | passed | 0.26686 seconds |
15
+ ./spec/features/homepage_spec.rb[1:1:2] | passed | 0.31045 seconds |
16
+ ./spec/features/homepage_spec.rb[1:2:1] | passed | 0.36642 seconds |
17
+ ./spec/features/homepage_spec.rb[1:2:2] | passed | 0.29678 seconds |
18
+ ./spec/features/homepage_spec.rb[1:3:1] | passed | 0.29245 seconds |
19
+ ./spec/features/homepage_spec.rb[1:3:2] | passed | 0.2174 seconds |
20
+ ./spec/features/homepage_spec.rb[1:4:1:1] | passed | 0.54381 seconds |
21
+ ./spec/features/product_page_spec.rb[1:1:1] | passed | 0.39065 seconds |
22
+ ./spec/features/product_page_spec.rb[1:1:2] | passed | 0.40425 seconds |
23
+ ./spec/features/product_page_spec.rb[1:1:3] | passed | 0.38355 seconds |
24
+ ./spec/features/product_page_spec.rb[1:2:1] | passed | 0.40304 seconds |
25
+ ./spec/features/product_page_spec.rb[1:2:2:1] | passed | 0.42235 seconds |
26
+ ./spec/features/product_page_spec.rb[1:2:3:1] | passed | 0.39108 seconds |
27
+ ./spec/features/product_page_spec.rb[1:3:1] | passed | 0.38062 seconds |
28
+ ./spec/features/product_page_spec.rb[1:3:2] | passed | 0.37097 seconds |
29
+ ./spec/features/product_page_spec.rb[1:3:3] | passed | 0.34059 seconds |
30
+ ./spec/features/product_page_spec.rb[1:4:1:1] | passed | 0.40027 seconds |
31
+ ./spec/features/product_page_spec.rb[1:4:2:1] | passed | 0.52408 seconds |
32
+ ./spec/features/taxon_page_spec.rb[1:1:1] | passed | 0.40921 seconds |
33
+ ./spec/features/taxon_page_spec.rb[1:1:2] | passed | 0.44084 seconds |
34
+ ./spec/features/taxon_page_spec.rb[1:1:3] | passed | 0.38952 seconds |
35
+ ./spec/features/taxon_page_spec.rb[1:2:1] | passed | 0.3867 seconds |
36
+ ./spec/features/taxon_page_spec.rb[1:2:2:1] | passed | 0.39532 seconds |
37
+ ./spec/features/taxon_page_spec.rb[1:2:3:1] | passed | 0.37653 seconds |
38
+ ./spec/features/taxon_page_spec.rb[1:3:1] | passed | 0.36491 seconds |
39
+ ./spec/features/taxon_page_spec.rb[1:3:2] | passed | 0.38757 seconds |
40
+ ./spec/features/taxon_page_spec.rb[1:4:1] | passed | 0.58312 seconds |
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  describe 'Add to cart', type: :system do
4
- let!(:store) { Spree::Store.default }
4
+ let!(:store) { create(:store) }
5
5
  let!(:order) { create :completed_order_with_totals }
6
6
  let!(:line_item) { order.line_items.first }
7
7
 
@@ -15,6 +15,16 @@ describe 'Add to cart', type: :system do
15
15
  find('#add-to-cart-button').click
16
16
  end
17
17
 
18
+ context 'when FACEBOOK_PIXEL_ID environment variable is present' do
19
+ let(:env_variable) { 'FACEBOOK_PIXEL_ID' }
20
+
21
+ it 'tracks "add to cart" event with product data' do
22
+ expect(page).to track_analytics_event :facebook, 'addtocart', [
23
+ 'fbq', 'track', 'AddToCart', line_item.sku
24
+ ]
25
+ end
26
+ end
27
+
18
28
  context 'when PINTEREST_TAG_ID environment variable is present' do
19
29
  let(:env_variable) { 'PINTEREST_TAG_ID' }
20
30
 
@@ -24,6 +34,10 @@ describe 'Add to cart', type: :system do
24
34
  line_item.name, line_item.variant.sku, line_item.variant.price
25
35
  ]
26
36
  end
37
+
38
+ it 'skips printing a flash message to the user with added_to_cart raw data' do
39
+ expect(page).to_not have_css '.flash.added_to_cart'
40
+ end
27
41
  end
28
42
  end
29
43
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  describe 'Checkout complete', type: :system do
4
- let!(:store) { Spree::Store.default }
4
+ let!(:store) { create(:store) }
5
5
  let!(:taxon) { create :taxon, name: 'MyTaxon' }
6
6
  let!(:order) { create :completed_order_with_totals }
7
7
  let!(:line_item) { order.line_items.first }
@@ -19,7 +19,7 @@ describe 'Checkout complete', type: :system do
19
19
  context 'when GOOGLE_TAG_MANAGER_ID environment variable is present' do
20
20
  let(:env_variable) { 'GOOGLE_TAG_MANAGER_ID' }
21
21
 
22
- it 'includes and executes a purchase event script' do
22
+ it 'tracks "purchase" event with product data' do
23
23
  subject
24
24
  expect(page).to track_analytics_event 'google-tag-manager', 'purchase', ['ecommerce', 'purchase', order.number, order.total, line_item.sku]
25
25
  end
@@ -28,7 +28,7 @@ describe 'Checkout complete', type: :system do
28
28
  context 'when GOOGLE_ANALYTICS_ID environment variable is present' do
29
29
  let(:env_variable) { 'GOOGLE_ANALYTICS_ID' }
30
30
 
31
- it 'includes and executes a purchase event script' do
31
+ it 'tracks "purchase" event with product data' do
32
32
  subject
33
33
  expect(page).to track_analytics_event 'google-analytics', 'purchase', [
34
34
  'event', 'purchase', 'transaction_id', order.number,
@@ -41,7 +41,7 @@ describe 'Checkout complete', type: :system do
41
41
  context 'when FACEBOOK_PIXEL_ID environment variable is present' do
42
42
  let(:env_variable) { 'FACEBOOK_PIXEL_ID' }
43
43
 
44
- it 'includes and executes a purchase event script' do
44
+ it 'tracks "Purchase" event with product data' do
45
45
  subject
46
46
  expect(page).to track_analytics_event :facebook, 'purchase', ['track', 'Purchase', order.total, line_item.sku, line_item.quantity, order.number]
47
47
  end
@@ -50,7 +50,7 @@ describe 'Checkout complete', type: :system do
50
50
  context 'when PINTEREST_TAG_ID environment variable is present' do
51
51
  let(:env_variable) { 'PINTEREST_TAG_ID' }
52
52
 
53
- it 'includes and executes a purchase event script' do
53
+ it 'tracks "checkout" event with product data' do
54
54
  subject
55
55
  expect(page).to track_analytics_event :pinterest, 'purchase', ['track', 'checkout', order.total, line_item.sku, line_item.name, line_item.price]
56
56
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Checkout initated', type: :system do
4
+ let!(:store) { create(:store) }
5
+ let!(:taxon) { create :taxon, name: 'MyTaxon' }
6
+ let!(:product) { create(:base_product, taxons: [taxon]) }
7
+ let(:order) { Spree::Order.last }
8
+
9
+ stub_authorization!
10
+
11
+ before do
12
+ stub_const 'ENV', ENV.to_h.merge(env_variable => 'XXX-YYYYY')
13
+ end
14
+
15
+ subject do
16
+ visit spree.product_path(product)
17
+ find('#add-to-cart-button').click
18
+ find('#checkout-link').click
19
+ end
20
+
21
+ context 'when GOOGLE_TAG_MANAGER_ID environment variable is present' do
22
+ let(:env_variable) { 'GOOGLE_TAG_MANAGER_ID' }
23
+
24
+ it 'tracks "InitiateCheckout" event with product data' do
25
+ skip
26
+ end
27
+ end
28
+
29
+ context 'when GOOGLE_ANALYTICS_ID environment variable is present' do
30
+ let(:env_variable) { 'GOOGLE_ANALYTICS_ID' }
31
+
32
+ it 'tracks "InitiateCheckout" event with product data' do
33
+ skip
34
+ end
35
+ end
36
+
37
+ context 'when FACEBOOK_PIXEL_ID environment variable is present' do
38
+ let(:env_variable) { 'FACEBOOK_PIXEL_ID' }
39
+
40
+ it 'tracks "InitiateCheckout" event with product data' do
41
+ subject
42
+ expect(page).to track_analytics_event :facebook, 'initiatecheckout', ['track', 'InitiateCheckout', order.total, order.currency, order.line_items.first.sku]
43
+ end
44
+ end
45
+
46
+ context 'when PINTEREST_TAG_ID environment variable is present' do
47
+ let(:env_variable) { 'PINTEREST_TAG_ID' }
48
+
49
+ it 'tracks "checkout" event with product data' do
50
+ skip
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  describe "Homepage", type: :system do
2
- let!(:store) { Spree::Store.default }
2
+ let!(:store) { create(:store) }
3
3
  let(:seo_name) { 'My store SEO name' }
4
4
  let(:seo_image) { 'https://example.com/path/store.jpg' }
5
5
  let(:seo_description) { 'My store SEO description' }
@@ -59,4 +59,19 @@ describe "Homepage", type: :system do
59
59
  expect(page).to have_css "meta[property='og:description'][content='#{seo_description}']", visible: false
60
60
  end
61
61
  end
62
+
63
+ context 'noscript tags' do
64
+ context 'when GOOGLE_TAG_MANAGER_ID is present' do
65
+ let(:env_variable) { 'GOOGLE_TAG_MANAGER_ID' }
66
+
67
+ before do
68
+ stub_const 'ENV', ENV.to_h.merge(env_variable => 'XXX-YYYYY')
69
+ end
70
+
71
+ it 'contains noscript tag for GTM' do
72
+ subject
73
+ expect(page).to have_text :all, "https://www.googletagmanager.com/ns.html"
74
+ end
75
+ end
76
+ end
62
77
  end
@@ -1,5 +1,5 @@
1
1
  describe "Product page", type: :system do
2
- let!(:store) { Spree::Store.default }
2
+ let!(:store) { create(:store) }
3
3
  let(:store_seo_name) { 'My store SEO name' }
4
4
 
5
5
  let!(:taxon) { create(:taxon, name: 'MyTaxon') }
@@ -97,6 +97,17 @@ describe "Product page", type: :system do
97
97
  stub_const 'ENV', ENV.to_h.merge(env_variable => 'XXX-YYYYY')
98
98
  end
99
99
 
100
+ context 'when FACEBOOK_PIXEL_ID environment variable is present' do
101
+ let(:env_variable) { 'FACEBOOK_PIXEL_ID' }
102
+
103
+ it 'tracks "ViewContent" event with product data' do
104
+ subject
105
+ expect(page).to track_analytics_event :facebook, 'viewcontent', [
106
+ 'fbq', 'track', 'ViewContent', product.name, product.master.sku
107
+ ]
108
+ end
109
+ end
110
+
100
111
  context 'when PINTEREST_TAG_ID environment variable is present' do
101
112
  let(:env_variable) { 'PINTEREST_TAG_ID' }
102
113
 
@@ -1,5 +1,5 @@
1
1
  describe "Taxon page", type: :system do
2
- let!(:store) { Spree::Store.default }
2
+ let!(:store) { create(:store) }
3
3
  let(:seo_name) { 'My store SEO name' }
4
4
  let(:seo_image) { 'https://example.com/path/store.jpg' }
5
5
  let(:seo_description) { 'My store SEO description' }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_seo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.10
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karma Creative
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solidus_core
@@ -337,6 +337,7 @@ files:
337
337
  - app/assets/javascripts/spree/frontend/solidus_seo.js
338
338
  - app/assets/stylesheets/spree/backend/solidus_seo.css
339
339
  - app/assets/stylesheets/spree/frontend/solidus_seo.css
340
+ - app/decorators/controllers/spree/checkout_controller_decorator.rb
340
341
  - app/decorators/controllers/spree/orders_controller_decorator.rb
341
342
  - app/decorators/controllers/spree/store_controller_decorator.rb
342
343
  - app/decorators/helpers/spree/core/controller_helpers/common_decorator.rb
@@ -346,6 +347,7 @@ files:
346
347
  - app/views/solidus_seo/_facebook.html.erb
347
348
  - app/views/solidus_seo/_google-analytics.html.erb
348
349
  - app/views/solidus_seo/_google-tag-manager.html.erb
350
+ - app/views/solidus_seo/_noscript_tags.html.erb
349
351
  - app/views/solidus_seo/_pinterest.html.erb
350
352
  - config/locales/en.yml
351
353
  - config/routes.rb
@@ -354,10 +356,12 @@ files:
354
356
  - lib/generators/solidus_seo/install/templates/insert_analytics_in_layout.html.erb.deface
355
357
  - lib/generators/solidus_seo/install/templates/insert_display_meta_tags_helper.html.erb.deface
356
358
  - lib/generators/solidus_seo/install/templates/insert_dump_jsonld_helper.html.erb.deface
359
+ - lib/generators/solidus_seo/install/templates/insert_noscript_tags.html.erb.deface
357
360
  - lib/generators/solidus_seo/install/templates/insert_product_jsonld_helper.html.erb.deface
358
361
  - lib/generators/solidus_seo/install/templates/insert_product_list_helper.html.erb.deface
359
362
  - lib/generators/solidus_seo/install/templates/paperclip_optimizer.rb
360
363
  - lib/generators/solidus_seo/install/templates/remove_original_title_tag.deface
364
+ - lib/generators/solidus_seo/install/templates/replace_flash_messages_helper.html.erb.deface
361
365
  - lib/generators/solidus_seo/install/templates/replace_taxon_breadcrumbs_helper.html.erb.deface
362
366
  - lib/solidus_seo.rb
363
367
  - lib/solidus_seo/engine.rb
@@ -380,6 +384,7 @@ files:
380
384
  - spec/examples.txt
381
385
  - spec/features/add_to_cart_spec.rb
382
386
  - spec/features/checkout_complete_spec.rb
387
+ - spec/features/checkout_initiated_spec.rb
383
388
  - spec/features/homepage_spec.rb
384
389
  - spec/features/product_page_spec.rb
385
390
  - spec/features/taxon_page_spec.rb
@@ -390,7 +395,7 @@ homepage: https://github.com/karmakatahdin/solidus_seo
390
395
  licenses:
391
396
  - BSD-3-Clause
392
397
  metadata: {}
393
- post_install_message:
398
+ post_install_message:
394
399
  rdoc_options: []
395
400
  require_paths:
396
401
  - lib
@@ -405,15 +410,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
405
410
  - !ruby/object:Gem::Version
406
411
  version: '0'
407
412
  requirements: []
408
- rubyforge_project:
413
+ rubyforge_project:
409
414
  rubygems_version: 2.7.6.2
410
- signing_key:
415
+ signing_key:
411
416
  specification_version: 4
412
417
  summary: Enhanced SEO in Solidus
413
418
  test_files:
414
419
  - spec/spec_helper.rb
415
420
  - spec/examples.txt
416
421
  - spec/features/checkout_complete_spec.rb
422
+ - spec/features/checkout_initiated_spec.rb
417
423
  - spec/features/homepage_spec.rb
418
424
  - spec/features/taxon_page_spec.rb
419
425
  - spec/features/add_to_cart_spec.rb