workarea-core 3.4.45 → 3.5.0.beta.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.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +52 -0
  3. data/app/assets/javascripts/workarea/core/modules/duplicate_id.js +1 -5
  4. data/app/assets/javascripts/workarea/core/modules/style_guide_autocomplete_fields.js +9 -42
  5. data/app/assets/javascripts/workarea/core/modules/url.js +14 -0
  6. data/app/controllers/workarea/application_controller.rb +5 -1
  7. data/app/controllers/workarea/authentication.rb +15 -26
  8. data/app/controllers/workarea/authorization.rb +3 -3
  9. data/app/controllers/workarea/current_referrer.rb +1 -2
  10. data/app/controllers/workarea/current_release.rb +1 -1
  11. data/app/controllers/workarea/current_segments.rb +52 -0
  12. data/app/controllers/workarea/current_tracking.rb +45 -0
  13. data/app/controllers/workarea/http_caching.rb +30 -0
  14. data/app/controllers/workarea/impersonation.rb +18 -44
  15. data/app/helpers/workarea/schema_org_helper.rb +21 -0
  16. data/app/mailers/workarea/application_mailer.rb +2 -4
  17. data/app/middleware/workarea/application_middleware.rb +44 -0
  18. data/app/middleware/workarea/query_cache_middleware.rb +55 -0
  19. data/app/middleware/workarea/release_server_middleware.rb +1 -1
  20. data/app/models/workarea/application_document.rb +1 -1
  21. data/app/models/workarea/bulk_action/product_edit.rb +6 -6
  22. data/app/models/workarea/calculate_percent_change.rb +1 -1
  23. data/app/models/workarea/catalog/category.rb +0 -2
  24. data/app/models/workarea/catalog/product.rb +19 -2
  25. data/app/models/workarea/checkout/collect_payment.rb +10 -1
  26. data/app/models/workarea/checkout/fraud/analyzer.rb +44 -0
  27. data/app/models/workarea/checkout/fraud/no_decision_analyzer.rb +14 -0
  28. data/app/models/workarea/checkout/fraud/test_analyzer.rb +26 -0
  29. data/app/models/workarea/checkout.rb +18 -6
  30. data/app/models/workarea/configuration/admin.rb +25 -0
  31. data/app/models/workarea/configuration/params.rb +45 -0
  32. data/app/models/workarea/content/asset.rb +5 -18
  33. data/app/models/workarea/content/block.rb +8 -2
  34. data/app/models/workarea/content/block_draft.rb +7 -2
  35. data/app/models/workarea/content/block_type.rb +2 -2
  36. data/app/models/workarea/content/block_type_definition.rb +4 -0
  37. data/app/models/workarea/content/preset.rb +1 -1
  38. data/app/models/workarea/content.rb +12 -82
  39. data/app/models/workarea/data_file/csv.rb +6 -8
  40. data/app/models/workarea/data_file/import.rb +9 -1
  41. data/app/models/workarea/data_file/json.rb +1 -20
  42. data/app/models/workarea/data_file/operation.rb +0 -4
  43. data/app/models/workarea/data_file/tax_rates.rb +3 -0
  44. data/app/models/workarea/featured_products.rb +8 -0
  45. data/app/models/workarea/fulfillment/policies/base.rb +21 -0
  46. data/app/models/workarea/fulfillment/policies/download.rb +21 -0
  47. data/app/models/workarea/fulfillment/policies/ignore.rb +11 -0
  48. data/app/models/workarea/fulfillment/policies/ship.rb +15 -0
  49. data/app/models/workarea/fulfillment/sku.rb +72 -0
  50. data/app/models/workarea/fulfillment/token.rb +36 -0
  51. data/app/models/workarea/inquiry.rb +1 -2
  52. data/app/models/workarea/insights/customer_acquisition.rb +5 -9
  53. data/app/models/workarea/insights/trending_products.rb +2 -2
  54. data/app/models/workarea/insights/trending_searches.rb +2 -2
  55. data/app/models/workarea/inventory/collection.rb +30 -0
  56. data/app/models/workarea/inventory/collection_status.rb +40 -0
  57. data/app/models/workarea/metrics/affinity.rb +33 -0
  58. data/app/models/workarea/metrics/country_by_day.rb +4 -0
  59. data/app/models/workarea/metrics/product_by_day.rb +3 -0
  60. data/app/models/workarea/metrics/product_by_week.rb +2 -0
  61. data/app/models/workarea/metrics/product_for_last_week.rb +8 -12
  62. data/app/models/workarea/metrics/sales_by_day.rb +5 -0
  63. data/app/models/workarea/metrics/search_by_day.rb +1 -3
  64. data/app/models/workarea/metrics/search_for_last_week.rb +5 -11
  65. data/app/models/workarea/metrics/segment_by_day.rb +31 -0
  66. data/app/models/workarea/metrics/sku_by_day.rb +3 -0
  67. data/app/models/workarea/metrics/tender_by_day.rb +11 -0
  68. data/app/models/workarea/metrics/update_user_aggregations.rb +77 -0
  69. data/app/models/workarea/metrics/user.rb +73 -87
  70. data/app/models/workarea/navigation/breadcrumbs.rb +10 -1
  71. data/app/models/workarea/order/fraud_decision.rb +18 -0
  72. data/app/models/workarea/order/item.rb +5 -0
  73. data/app/models/workarea/order/queries.rb +1 -0
  74. data/app/models/workarea/order/status.rb +10 -1
  75. data/app/models/workarea/order.rb +47 -4
  76. data/app/models/workarea/payment/credit_card.rb +12 -0
  77. data/app/models/workarea/payment.rb +7 -2
  78. data/app/models/workarea/pricing/cache_key.rb +9 -3
  79. data/app/models/workarea/pricing/calculator.rb +5 -1
  80. data/app/models/workarea/pricing/calculators/tax_calculator.rb +32 -5
  81. data/app/models/workarea/pricing/discount/application_group.rb +8 -3
  82. data/app/models/workarea/pricing/discount/free_gift.rb +2 -1
  83. data/app/models/workarea/pricing/discount/redemption.rb +1 -1
  84. data/app/models/workarea/pricing/discount.rb +2 -3
  85. data/app/models/workarea/pricing/item_tax_applier.rb +41 -0
  86. data/app/models/workarea/pricing/price.rb +1 -0
  87. data/app/models/workarea/pricing/request.rb +11 -0
  88. data/app/models/workarea/pricing/sku.rb +1 -0
  89. data/app/models/workarea/pricing/tax_application.rb +21 -0
  90. data/app/models/workarea/pricing/tax_applier.rb +12 -15
  91. data/app/models/workarea/pricing/unsupported_segmentation.rb +22 -0
  92. data/app/models/workarea/product_rule.rb +5 -0
  93. data/app/models/workarea/releasable.rb +83 -89
  94. data/app/models/workarea/release/activation.rb +45 -0
  95. data/app/models/workarea/release/changes.rb +45 -0
  96. data/app/models/workarea/release/changeset.rb +42 -52
  97. data/app/models/workarea/release/preview.rb +28 -0
  98. data/app/models/workarea/release/status.rb +2 -24
  99. data/app/models/workarea/release.rb +72 -99
  100. data/app/models/workarea/release_session.rb +11 -11
  101. data/app/models/workarea/search/admin/catalog_product.rb +1 -2
  102. data/app/models/workarea/search/admin/fulfillment_sku.rb +27 -0
  103. data/app/models/workarea/search/admin/order.rb +1 -1
  104. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  105. data/app/models/workarea/search/admin/release.rb +1 -4
  106. data/app/models/workarea/search/admin/segment.rb +19 -0
  107. data/app/models/workarea/search/admin.rb +17 -39
  108. data/app/models/workarea/search/order_text.rb +23 -6
  109. data/app/models/workarea/search/storefront/category_query.rb +152 -0
  110. data/app/models/workarea/search/storefront/product/categories.rb +11 -45
  111. data/app/models/workarea/search/storefront.rb +33 -29
  112. data/app/models/workarea/segment/first_time_customer.rb +8 -0
  113. data/app/models/workarea/segment/first_time_visitor.rb +12 -0
  114. data/app/models/workarea/segment/life_cycle.rb +44 -0
  115. data/app/models/workarea/segment/loyal_customer.rb +12 -0
  116. data/app/models/workarea/segment/returning_customer.rb +14 -0
  117. data/app/models/workarea/segment/returning_visitor.rb +12 -0
  118. data/app/models/workarea/segment/rules/base.rb +16 -0
  119. data/app/models/workarea/segment/rules/browser_info.rb +29 -0
  120. data/app/models/workarea/segment/rules/geolocation.rb +29 -0
  121. data/app/models/workarea/segment/rules/geolocation_option.rb +53 -0
  122. data/app/models/workarea/segment/rules/last_order.rb +14 -0
  123. data/app/models/workarea/segment/rules/logged_in.rb +13 -0
  124. data/app/models/workarea/segment/rules/orders.rb +17 -0
  125. data/app/models/workarea/segment/rules/revenue.rb +17 -0
  126. data/app/models/workarea/segment/rules/sessions.rb +17 -0
  127. data/app/models/workarea/segment/rules/tags.rb +14 -0
  128. data/app/models/workarea/segment/rules/traffic_referrer.rb +18 -0
  129. data/app/models/workarea/segment.rb +54 -0
  130. data/app/models/workarea/segmentable.rb +66 -0
  131. data/app/models/workarea/sort.rb +14 -2
  132. data/app/models/workarea/tax/rate.rb +35 -1
  133. data/app/models/workarea/user/authorization.rb +19 -13
  134. data/app/models/workarea/user/login.rb +4 -0
  135. data/app/models/workarea/user/password_reset.rb +1 -3
  136. data/app/queries/workarea/categorization.rb +3 -3
  137. data/app/queries/workarea/featured_categorization.rb +53 -0
  138. data/app/queries/workarea/order_cancellation_metrics.rb +155 -0
  139. data/app/queries/workarea/order_item_details.rb +16 -3
  140. data/app/queries/workarea/order_metrics.rb +32 -3
  141. data/app/queries/workarea/product_primary_navigation.rb +13 -2
  142. data/app/queries/workarea/product_releases.rb +38 -0
  143. data/app/queries/workarea/recommendation/user_activity_based.rb +14 -6
  144. data/app/queries/workarea/reports/average_order_value.rb +1 -1
  145. data/app/queries/workarea/reports/customers.rb +14 -11
  146. data/app/queries/workarea/reports/first_time_vs_returning_sales.rb +1 -1
  147. data/app/queries/workarea/reports/group_by_time.rb +13 -17
  148. data/app/queries/workarea/reports/sales_by_category.rb +1 -1
  149. data/app/queries/workarea/reports/sales_by_country.rb +10 -3
  150. data/app/queries/workarea/reports/sales_by_discount.rb +1 -1
  151. data/app/queries/workarea/reports/sales_by_menu.rb +1 -1
  152. data/app/queries/workarea/reports/sales_by_product.rb +39 -4
  153. data/app/queries/workarea/reports/sales_by_sku.rb +39 -4
  154. data/app/queries/workarea/reports/sales_by_tender.rb +42 -0
  155. data/app/queries/workarea/reports/sales_by_traffic_referrer.rb +1 -1
  156. data/app/queries/workarea/reports/sales_over_time.rb +10 -3
  157. data/app/queries/workarea/reports/searches.rb +1 -1
  158. data/app/queries/workarea/reports/searches_over_time.rb +1 -1
  159. data/app/queries/workarea/reports/searches_without_results_over_time.rb +1 -1
  160. data/app/queries/workarea/search/admin_fulfillment_skus.rb +20 -0
  161. data/app/queries/workarea/search/admin_releases.rb +1 -4
  162. data/app/queries/workarea/search/admin_search.rb +0 -4
  163. data/app/queries/workarea/search/admin_segments.rb +16 -0
  164. data/app/queries/workarea/search/admin_sorting.rb +1 -1
  165. data/app/queries/workarea/search/pagination.rb +1 -4
  166. data/app/queries/workarea/search/product_display_rules.rb +40 -8
  167. data/app/queries/workarea/search/product_entries.rb +15 -1
  168. data/app/queries/workarea/search/product_search.rb +4 -1
  169. data/app/queries/workarea/search/storefront_search/exact_matches.rb +1 -1
  170. data/app/queries/workarea/search/storefront_search/response.rb +6 -4
  171. data/app/queries/workarea/search/storefront_search.rb +5 -4
  172. data/app/seeds/workarea/assets_seeds.rb +2 -1
  173. data/app/seeds/workarea/insights_seeds.rb +0 -23
  174. data/app/seeds/workarea/orders_seeds.rb +7 -6
  175. data/app/seeds/workarea/products_seeds.rb +2 -0
  176. data/app/seeds/workarea/segments_seeds.rb +8 -0
  177. data/app/seeds/workarea/tax_seeds.rb +3 -3
  178. data/app/services/workarea/cancel_order.rb +8 -3
  179. data/app/services/workarea/copy_order.rb +6 -0
  180. data/app/services/workarea/create_fulfillment.rb +5 -3
  181. data/app/services/workarea/direct_upload.rb +11 -19
  182. data/app/services/workarea/hash_update.rb +1 -18
  183. data/app/services/workarea/packaging.rb +1 -1
  184. data/app/services/workarea/save_publishing.rb +5 -1
  185. data/app/workers/sidekiq/callbacks.rb +4 -52
  186. data/app/workers/sidekiq/callbacks_worker.rb +4 -6
  187. data/app/workers/workarea/bulk_index_admin.rb +2 -2
  188. data/app/workers/workarea/bulk_index_products.rb +6 -5
  189. data/app/workers/workarea/bulk_index_searches.rb +5 -5
  190. data/app/workers/workarea/deactivate_stale_discounts.rb +3 -3
  191. data/app/workers/workarea/generate_insights.rb +1 -1
  192. data/app/workers/workarea/index_admin_search.rb +1 -0
  193. data/app/workers/workarea/index_categorization.rb +4 -7
  194. data/app/workers/workarea/index_category.rb +2 -1
  195. data/app/workers/workarea/index_category_changes.rb +11 -6
  196. data/app/workers/workarea/index_fulfillment_changes.rb +2 -1
  197. data/app/workers/workarea/index_help.rb +2 -1
  198. data/app/workers/workarea/index_page.rb +2 -1
  199. data/app/workers/workarea/index_payment_transactions.rb +2 -1
  200. data/app/workers/workarea/index_product.rb +4 -4
  201. data/app/workers/workarea/index_product_children.rb +4 -3
  202. data/app/workers/workarea/index_product_rule.rb +3 -2
  203. data/app/workers/workarea/index_search_customizations.rb +3 -2
  204. data/app/workers/workarea/index_skus.rb +5 -6
  205. data/app/workers/workarea/keep_product_index_fresh.rb +3 -5
  206. data/app/workers/workarea/process_import.rb +3 -3
  207. data/app/workers/workarea/process_search_recommendations.rb +5 -9
  208. data/app/workers/workarea/publish_release.rb +1 -0
  209. data/app/workers/workarea/save_metrics.rb +116 -0
  210. data/app/workers/workarea/save_order_cancellation_metrics.rb +35 -0
  211. data/app/workers/workarea/save_order_metrics.rb +10 -74
  212. data/app/workers/workarea/status_reporter.rb +2 -4
  213. data/app/workers/workarea/synchronize_user_metrics.rb +17 -0
  214. data/app/workers/workarea/update_payment_profile_email.rb +22 -0
  215. data/app/workers/workarea/verify_scheduled_releases.rb +4 -11
  216. data/config/initializers/00_configuration.rb +185 -0
  217. data/config/initializers/02_assets.rb +1 -0
  218. data/config/initializers/05_scheduled_jobs.rb +0 -7
  219. data/config/initializers/10_rack_middleware.rb +2 -5
  220. data/config/initializers/11_payment.rb +4 -0
  221. data/config/initializers/13_rack_attack.rb +2 -4
  222. data/config/initializers/14_content_block_types.rb +16 -16
  223. data/config/initializers/15_endpoint_monitoring.rb +3 -6
  224. data/config/initializers/{21_premailer.rb → 24_premailer.rb} +1 -0
  225. data/config/initializers/{20_i18n_js.rb → 25_i18n_js.rb} +0 -0
  226. data/config/locales/en.yml +13 -24
  227. data/lib/generators/workarea/content_block_type/templates/initializer.rb +1 -1
  228. data/lib/generators/workarea/install/USAGE +0 -1
  229. data/lib/generators/workarea/install/install_generator.rb +0 -21
  230. data/lib/generators/workarea/install/templates/initializer.rb.erb +1 -1
  231. data/lib/tasks/insights.rake +1 -0
  232. data/lib/tasks/migrate.rake +106 -0
  233. data/lib/tasks/search.rake +17 -19
  234. data/lib/tasks/tests.rake +1 -1
  235. data/lib/workarea/cache.rb +6 -35
  236. data/lib/workarea/changelog.rake +2 -2
  237. data/lib/workarea/configuration/administrable/definition.rb +42 -0
  238. data/lib/workarea/configuration/administrable/field.rb +79 -0
  239. data/lib/workarea/configuration/administrable/fieldset.rb +44 -0
  240. data/lib/workarea/configuration/administrable_options.rb +24 -0
  241. data/lib/workarea/configuration/cache_store.rb +3 -1
  242. data/lib/workarea/configuration/content_blocks.rb +17 -0
  243. data/lib/workarea/configuration/mongoid.rb +1 -4
  244. data/lib/workarea/configuration/session.rb +36 -0
  245. data/lib/workarea/configuration/sidekiq.rb +3 -1
  246. data/lib/workarea/configuration.rb +121 -148
  247. data/lib/workarea/core/engine.rb +3 -58
  248. data/lib/workarea/core.rb +15 -11
  249. data/lib/workarea/elasticsearch/document.rb +8 -15
  250. data/lib/workarea/ext/freedom_patches/action_view_cache_helper.rb +4 -6
  251. data/lib/workarea/ext/freedom_patches/active_support_duration.rb +14 -0
  252. data/lib/workarea/ext/freedom_patches/money.rb +11 -0
  253. data/lib/workarea/ext/freedom_patches/premailer.rb +6 -0
  254. data/lib/workarea/ext/freedom_patches/string.rb +19 -4
  255. data/lib/workarea/ext/mongoid/find_ordered.rb +2 -2
  256. data/lib/workarea/ext/mongoid/lookup_hash.rb +30 -0
  257. data/lib/workarea/geolocation.rb +24 -6
  258. data/lib/workarea/routes_constraints/super_admin.rb +1 -1
  259. data/lib/workarea/version.rb +3 -4
  260. data/lib/workarea/visit.rb +92 -0
  261. data/lib/workarea/warnings.rb +95 -0
  262. data/lib/workarea.rb +102 -3
  263. data/test/dummy/config/initializers/session_store.rb +1 -1
  264. data/test/fixtures/tax_rates.csv +3 -3
  265. data/test/generators/workarea/content_block_type_generator_test.rb +1 -1
  266. data/test/generators/workarea/install_generator_test.rb +0 -13
  267. data/test/integration/workarea/authentication_test.rb +27 -4
  268. data/test/integration/workarea/authorization_test.rb +5 -0
  269. data/test/integration/workarea/cache_varies_integration_test.rb +21 -23
  270. data/test/integration/workarea/monitoring_integration_test.rb +5 -10
  271. data/test/javascripts/duplicate_id_spec.js +1 -7
  272. data/test/javascripts/fixtures/{duplicate_id_fail.html.haml → duplicate_id.html.haml} +0 -1
  273. data/test/javascripts/form_submitting_controls_spec.js +0 -1
  274. data/test/lib/workarea/asset_endpoints/favicons_test.rb +11 -13
  275. data/test/lib/workarea/configuration/administrable/definition_test.rb +71 -0
  276. data/test/lib/workarea/configuration/administrable/field_test.rb +128 -0
  277. data/test/lib/workarea/configuration/administrable/fieldset_test.rb +78 -0
  278. data/test/lib/workarea/configuration/configuration_test.rb +20 -0
  279. data/test/lib/workarea/elasticsearch/document_test.rb +0 -20
  280. data/test/lib/workarea/elasticsearch/query_cache_test.rb +7 -7
  281. data/test/lib/workarea/ext/freedom_patches/money_test.rb +11 -0
  282. data/test/lib/workarea/ext/mongoid/lookup_hash_test.rb +86 -0
  283. data/test/lib/workarea/geolocation_test.rb +20 -0
  284. data/test/mailers/workarea/application_mailer_test.rb +1 -11
  285. data/test/middleware/workarea/query_cache_middleware_test.rb +55 -0
  286. data/test/models/workarea/checkout/collect_payment_test.rb +14 -6
  287. data/test/models/workarea/checkout_test.rb +31 -57
  288. data/test/models/workarea/configuration/params_test.rb +37 -0
  289. data/test/models/workarea/data_file/csv_test.rb +8 -73
  290. data/test/models/workarea/data_file/import_test.rb +31 -0
  291. data/test/models/workarea/data_file/json_test.rb +6 -48
  292. data/test/models/workarea/data_file/tax_test.rb +3 -0
  293. data/test/models/workarea/fulfillment/policies/download_test.rb +39 -0
  294. data/test/models/workarea/fulfillment/sku_test.rb +54 -0
  295. data/test/models/workarea/insights/best_customers_test.rb +5 -2
  296. data/test/models/workarea/insights/best_full_price_customers_test.rb +5 -2
  297. data/test/models/workarea/insights/customer_acquisition_test.rb +1 -1
  298. data/test/models/workarea/insights/customers_at_risk_test.rb +1 -1
  299. data/test/models/workarea/insights/low_aov_customers_test.rb +1 -1
  300. data/test/models/workarea/inventory/collection_test.rb +75 -0
  301. data/test/models/workarea/metrics/affinity_test.rb +85 -0
  302. data/test/models/workarea/metrics/product_by_week_test.rb +27 -31
  303. data/test/models/workarea/metrics/search_by_day_test.rb +3 -0
  304. data/test/models/workarea/metrics/search_by_week_test.rb +27 -31
  305. data/test/models/workarea/metrics/update_user_aggregations_test.rb +62 -0
  306. data/test/models/workarea/metrics/user_test.rb +146 -63
  307. data/test/models/workarea/navigation/breadcrumbs_test.rb +12 -2
  308. data/test/models/workarea/order/queries_test.rb +2 -0
  309. data/test/models/workarea/order_test.rb +44 -0
  310. data/test/models/workarea/payment/address_test.rb +109 -111
  311. data/test/models/workarea/payment/credit_card_integration_test.rb +0 -52
  312. data/test/models/workarea/payment/credit_card_test.rb +5 -0
  313. data/test/models/workarea/pricing/cache_key_test.rb +7 -1
  314. data/test/models/workarea/pricing/calculators/tax_calculator_test.rb +41 -1
  315. data/test/models/workarea/pricing/discount/collection_test.rb +27 -29
  316. data/test/models/workarea/pricing/discount_test.rb +22 -24
  317. data/test/models/workarea/pricing/item_tax_applier_test.rb +83 -0
  318. data/test/models/workarea/pricing/price_test.rb +9 -0
  319. data/test/models/workarea/pricing/request_test.rb +13 -0
  320. data/test/models/workarea/pricing/sku_test.rb +9 -0
  321. data/test/models/workarea/releasable_active_test.rb +113 -0
  322. data/test/models/workarea/releasable_test.rb +69 -120
  323. data/test/models/workarea/release/changeset_test.rb +41 -0
  324. data/test/models/workarea/release_jobs_test.rb +52 -0
  325. data/test/models/workarea/release_previewing_test.rb +43 -0
  326. data/test/models/workarea/release_test.rb +59 -153
  327. data/test/models/workarea/search/admin/content_asset_test.rb +26 -28
  328. data/test/models/workarea/search/order_text_test.rb +35 -0
  329. data/test/models/workarea/search/storefront/category_query_test.rb +81 -0
  330. data/test/models/workarea/search/storefront/product/categories_test.rb +10 -70
  331. data/test/models/workarea/search/storefront/product_test.rb +10 -11
  332. data/test/models/workarea/search/storefront_test.rb +1 -13
  333. data/test/models/workarea/segment/life_cycle_test.rb +24 -0
  334. data/test/models/workarea/segment/rules/browser_info_test.rb +33 -0
  335. data/test/models/workarea/segment/rules/geolocation_option_test.rb +16 -0
  336. data/test/models/workarea/segment/rules/geolocation_test.rb +49 -0
  337. data/test/models/workarea/segment/rules/last_order_test.rb +32 -0
  338. data/test/models/workarea/segment/rules/logged_in_test.rb +25 -0
  339. data/test/models/workarea/segment/rules/orders_test.rb +59 -0
  340. data/test/models/workarea/segment/rules/revenue_test.rb +59 -0
  341. data/test/models/workarea/segment/rules/sessions_test.rb +26 -0
  342. data/test/models/workarea/segment/rules/tags_test.rb +27 -0
  343. data/test/models/workarea/segment/rules/traffic_referrer_test.rb +31 -0
  344. data/test/models/workarea/segment_test.rb +80 -0
  345. data/test/models/workarea/segmentable_test.rb +74 -0
  346. data/test/models/workarea/shipping/address_test.rb +109 -111
  347. data/test/models/workarea/shipping/sku_test.rb +8 -12
  348. data/test/models/workarea/user/password_reset_test.rb +4 -12
  349. data/test/models/workarea/user_test.rb +13 -10
  350. data/test/queries/workarea/admin_search_query_wrapper_test.rb +21 -25
  351. data/test/queries/workarea/categorization_test.rb +49 -0
  352. data/test/queries/workarea/featured_categorization_test.rb +66 -0
  353. data/test/queries/workarea/order_cancellation_metrics_test.rb +203 -0
  354. data/test/queries/workarea/order_item_details_test.rb +17 -0
  355. data/test/queries/workarea/order_metrics_test.rb +12 -0
  356. data/test/queries/workarea/product_releases_test.rb +56 -0
  357. data/test/queries/workarea/recommendation/searches_test.rb +3 -3
  358. data/test/queries/workarea/recommendation/user_activity_based_test.rb +4 -4
  359. data/test/queries/workarea/reports/customers_test.rb +12 -8
  360. data/test/queries/workarea/reports/report_test.rb +4 -6
  361. data/test/queries/workarea/reports/sales_by_country_test.rb +18 -3
  362. data/test/queries/workarea/reports/sales_by_product_test.rb +28 -8
  363. data/test/queries/workarea/reports/sales_by_sku_test.rb +28 -8
  364. data/test/queries/workarea/reports/sales_by_tender_test.rb +100 -0
  365. data/test/queries/workarea/reports/sales_by_traffic_referrer_test.rb +6 -6
  366. data/test/queries/workarea/search/admin_releases_test.rb +1 -26
  367. data/test/queries/workarea/search/admin_search_test.rb +0 -10
  368. data/test/queries/workarea/search/admin_users_test.rb +2 -2
  369. data/test/queries/workarea/search/category_browse_test.rb +53 -0
  370. data/test/queries/workarea/search/facet_sorting/size_test.rb +11 -13
  371. data/test/queries/workarea/search/pagination_test.rb +9 -26
  372. data/test/queries/workarea/search/product_entries_test.rb +27 -0
  373. data/test/queries/workarea/search/product_search_test.rb +0 -16
  374. data/test/queries/workarea/search/storefront_search/response_test.rb +26 -0
  375. data/test/queries/workarea/search/storefront_search_test.rb +34 -36
  376. data/test/services/workarea/cancel_order_test.rb +27 -13
  377. data/test/services/workarea/copy_order_test.rb +17 -0
  378. data/test/services/workarea/direct_upload_test.rb +1 -46
  379. data/test/services/workarea/export_report_test.rb +41 -45
  380. data/test/services/workarea/hash_update_test.rb +12 -12
  381. data/test/services/workarea/packaging_test.rb +9 -11
  382. data/test/services/workarea/save_publishing_test.rb +23 -0
  383. data/test/workers/sidekiq/callbacks_test.rb +0 -22
  384. data/test/workers/workarea/deactivate_stale_discounts_test.rb +2 -2
  385. data/test/workers/workarea/index_category_changes_test.rb +5 -7
  386. data/test/workers/workarea/keep_product_index_fresh_test.rb +1 -1
  387. data/test/workers/workarea/process_import_test.rb +0 -6
  388. data/test/workers/workarea/process_search_recommendations_test.rb +4 -5
  389. data/test/workers/workarea/status_reporter_test.rb +2 -1
  390. data/test/workers/workarea/synchronize_user_metrics_test.rb +57 -0
  391. data/test/workers/workarea/update_payment_profile_email_test.rb +27 -0
  392. data/test/workers/workarea/verify_scheduled_releases_test.rb +0 -26
  393. data/workarea-core.gemspec +13 -11
  394. metadata +196 -92
  395. data/app/assets/javascripts/workarea/core/templates/ui_menu_item.jst.ejs +0 -10
  396. data/app/controllers/workarea/admin_guest_browsing.rb +0 -54
  397. data/app/middleware/workarea/rack_cache_config_middleware.rb +0 -19
  398. data/app/queries/workarea/search/search_suggestions.rb +0 -43
  399. data/app/workers/workarea/bust_discount_cache.rb +0 -16
  400. data/app/workers/workarea/clean_user_activity.rb +0 -11
  401. data/app/workers/workarea/undo_release.rb +0 -15
  402. data/app/workers/workarea/update_email.rb +0 -33
  403. data/lib/generators/workarea/docker/USAGE +0 -16
  404. data/lib/generators/workarea/docker/docker_generator.rb +0 -61
  405. data/lib/generators/workarea/docker/templates/.env.erb +0 -6
  406. data/lib/generators/workarea/docker/templates/Dockerfile.erb +0 -48
  407. data/lib/generators/workarea/docker/templates/docker-compose.yml.erb +0 -72
  408. data/lib/generators/workarea/docker/templates/docker-entrypoint.sh.erb +0 -6
  409. data/lib/generators/workarea/docker/templates/docker-sync.yml.erb +0 -8
  410. data/lib/generators/workarea/docker/templates/docker-wait.sh +0 -11
  411. data/lib/generators/workarea/docker/templates/docker.env +0 -16
  412. data/lib/generators/workarea/docker/templates/docker_init.rb.erb +0 -29
  413. data/lib/workarea/configuration/headless_chrome.rb +0 -42
  414. data/lib/workarea/configuration/puma.rb +0 -37
  415. data/lib/workarea/ext/freedom_patches/i18n_js.rb +0 -27
  416. data/lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb +0 -25
  417. data/lib/workarea/ext/jbuilder/jbuilder_cache.rb +0 -29
  418. data/lib/workarea/ext/referer_parser/parser.decorator +0 -43
  419. data/lib/workarea/queues_pauser.rb +0 -26
  420. data/lib/workarea/robots.rb +0 -9
  421. data/test/generators/workarea/docker_generator_test.rb +0 -156
  422. data/test/javascripts/fixtures/duplicate_id_pass.html.haml +0 -2
  423. data/test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb +0 -25
  424. data/test/lib/workarea/ext/referer_parser/parser_test.rb +0 -20
  425. data/test/queries/workarea/search/search_suggestions_test.rb +0 -29
  426. data/test/workers/workarea/undo_release_test.rb +0 -23
  427. data/test/workers/workarea/update_email_test.rb +0 -39
@@ -113,44 +113,19 @@ module Workarea
113
113
  assert_equal(1, model.changesets.length)
114
114
  assert_equal(@release.id, model.changesets.first.release_id)
115
115
  assert_equal('Changed', model.changesets.first.changeset['name'])
116
+ assert_equal('Test', model.changesets.first.original['name'])
116
117
 
117
118
  assert_equal('Bar', model.bars.first.name)
118
119
  assert_equal(1, model.bars.first.changesets.length)
119
120
  assert_equal(@release.id, model.bars.first.changesets.first.release_id)
120
121
  assert_equal('Bar Changed', model.bars.first.changesets.first.changeset['name'])
122
+ assert_equal('Bar', model.bars.first.changesets.first.original['name'])
121
123
 
122
124
  assert_equal('Baz', model.baz.name)
123
125
  assert_equal(1, model.baz.changesets.length)
124
126
  assert_equal(@release.id, model.baz.changesets.first.release_id)
125
127
  assert_equal('Baz Changed', model.baz.changesets.first.changeset['name'])
126
- end
127
-
128
- def test_save_does_not_log_undone_changes
129
- model = Foo.create!(
130
- name: 'Test',
131
- blank_field: 'test'
132
- )
133
-
134
- Release.with_current(@release.id) do
135
- model.name = 'Changed'
136
- model.blank_field = 'changed'
137
- model.save!
138
-
139
- model.name = 'Test'
140
- model.blank_field = 'changed'
141
- model.save!
142
- end
143
-
144
- assert(model.changesets.first.present?)
145
- assert_equal('changed', model.changesets.first.changeset['blank_field'])
146
- assert_nil(model.changesets.first.changeset['name'])
147
-
148
- Release.with_current(@release.id) do
149
- model.blank_field = 'test'
150
- model.save!
151
- end
152
-
153
- assert(model.changesets.empty?)
128
+ assert_equal('Baz', model.baz.changesets.first.original['name'])
154
129
  end
155
130
 
156
131
  def test_save_does_not_log_release_changes_if_invalid
@@ -215,16 +190,19 @@ module Workarea
215
190
  assert_equal(1, model.changesets.length)
216
191
  assert_equal(@release.id, model.changesets.first.release_id)
217
192
  assert_equal('Changed', model.changesets.first.changeset['name'])
193
+ assert_equal('Test', model.changesets.first.original['name'])
218
194
 
219
195
  assert_equal('Bar', model.bars.first.name)
220
196
  assert_equal(1, model.bars.first.changesets.length)
221
197
  assert_equal(@release.id, model.bars.first.changesets.first.release_id)
222
198
  assert_equal('Bar Changed', model.bars.first.changesets.first.changeset['name'])
199
+ assert_equal('Bar', model.bars.first.changesets.first.original['name'])
223
200
 
224
201
  assert_equal('Baz', model.baz.name)
225
202
  assert_equal(1, model.baz.changesets.length)
226
203
  assert_equal(@release.id, model.baz.changesets.first.release_id)
227
204
  assert_equal('Baz Changed', model.baz.changesets.first.changeset['name'])
205
+ assert_equal('Baz', model.baz.changesets.first.original['name'])
228
206
  end
229
207
 
230
208
  def test_save_does_not_save_timestamp_changes
@@ -236,6 +214,9 @@ module Workarea
236
214
 
237
215
  fields_in_change = model.changesets.first.changeset.keys
238
216
  refute_includes(fields_in_change, 'updated_at')
217
+
218
+ fields_in_original = model.changesets.first.original.keys
219
+ refute_includes(fields_in_original, 'updated_at')
239
220
  end
240
221
 
241
222
  def test_save_does_not_save_slug_changes
@@ -261,21 +242,9 @@ module Workarea
261
242
 
262
243
  fields_in_change = model.changesets.first.changeset.keys
263
244
  refute_includes(fields_in_change, 'blank_field')
264
- end
265
-
266
- def test_save_can_schedule_activation
267
- model = Foo.create!(
268
- name: 'Test',
269
- active: true,
270
- activate_with: @release.id
271
- )
272
-
273
- model.reload
274
245
 
275
- refute(model.active)
276
- assert_equal(1, model.changesets.length)
277
- assert_equal(@release.id, model.changesets.first.release_id)
278
- assert(model.changesets.first.changeset['active'])
246
+ fields_in_original = model.changesets.first.original.keys
247
+ refute_includes(fields_in_original, 'blank_field')
279
248
  end
280
249
 
281
250
  def test_save_ignores_illegal_values
@@ -291,34 +260,6 @@ module Workarea
291
260
  assert_equal(0, model.changesets.length)
292
261
  end
293
262
 
294
- def test_save_can_schedule_activation_for_an_embedded_document
295
- model = Foo.create!(name: 'Test')
296
-
297
- embedded_1 = model.bars.create!(
298
- name: 'Bar',
299
- active: true,
300
- activate_with: @release.id
301
- )
302
-
303
- embedded_2 = model.bars.create!(
304
- name: 'Baz',
305
- active: true,
306
- activate_with: @release.id
307
- )
308
-
309
- model.reload
310
-
311
- refute(embedded_1.active)
312
- assert_equal(1, embedded_1.changesets.length)
313
- assert_equal(@release.id, embedded_1.changesets.first.release_id)
314
- assert(embedded_1.changesets.first.changeset['active'])
315
-
316
- refute(embedded_2.active)
317
- assert_equal(1, embedded_2.changesets.length)
318
- assert_equal(@release.id, embedded_2.changesets.first.release_id)
319
- assert(embedded_2.changesets.first.changeset['active'])
320
- end
321
-
322
263
  def test_destroys_related_changesets
323
264
  model = Foo.create!(
324
265
  name: 'Test',
@@ -361,6 +302,7 @@ module Workarea
361
302
  assert_equal(1, model.changesets.length)
362
303
  assert_equal(@release.id, model.changesets.first.release_id)
363
304
  assert_equal('Changed', model.changesets.first.changeset['name'])
305
+ assert_equal('Test', model.changesets.first.original['name'])
364
306
  end
365
307
 
366
308
  def test_destroys_a_changeset_where_it_is_the_only_change_if_embedded
@@ -407,73 +349,80 @@ module Workarea
407
349
  assert_equal('Baz Changed', model.baz.name)
408
350
  end
409
351
 
410
- def test_undo
411
- model = Foo.create!(
412
- name: 'Test',
413
- bars: [{ name: 'Bar' }],
414
- baz: { name: 'Baz' }
415
- )
352
+ def test_deleting_embedded
353
+ model = Foo.create!(name: 'Foo', bars: [{ name: 'Test' }])
354
+ @release.as_current { model.bars.first.destroy }
416
355
 
417
- Release.with_current(@release.id) do
418
- model.name = 'Changed'
419
- model.save!
420
-
421
- model.bars.first.name = 'Bar Changed'
422
- model.bars.first.save!
356
+ model.reload
357
+ assert(model.bars.first.active?)
423
358
 
424
- model.baz.name = 'Baz Changed'
425
- model.baz.save!
359
+ @release.as_current do
360
+ model.reload
361
+ refute(model.bars.first.active?)
426
362
  end
363
+ end
427
364
 
428
- @release.changesets.each(&:publish!)
429
- model.reload
430
-
431
- assert_equal('Changed', model.name)
432
- assert_equal('Bar Changed', model.bars.first.name)
433
- assert_equal('Baz Changed', model.baz.name)
365
+ def test_in_release
366
+ model = Foo.create!(name: 'Foo')
367
+ @release.as_current { model.update!(name: 'Bar') }
434
368
 
435
- @release.changesets.each(&:undo!)
436
369
  model.reload
437
-
438
- assert_equal('Test', model.name)
439
- assert_equal('Bar', model.bars.first.name)
440
- assert_equal('Baz', model.baz.name)
370
+ in_release = model.in_release(@release)
371
+ assert_equal('Bar', in_release.name)
372
+ refute_equal(in_release.object_id, model.object_id)
373
+
374
+ @release.as_current { model.reload }
375
+ in_release = model.in_release(nil)
376
+ assert_equal('Foo', in_release.name)
377
+ refute_equal(in_release.object_id, model.object_id)
441
378
  end
442
379
 
443
- def test_activates_with_current_release
444
- model = Foo.create!(name: 'Test', active: false)
445
- refute(model.activates_with_current_release?)
380
+ def test_skip_changeset
381
+ model = Foo.create!(name: 'Foo')
446
382
 
447
- Release.with_current(@release.id) do
448
- model.active = true
449
- model.save!
383
+ @release.as_current do
384
+ model.skip_changeset { model.update!(name: 'Bar') }
385
+ end
450
386
 
451
- model.reload
452
- assert(model.activates_with_current_release?)
387
+ assert_equal('Bar', model.reload.name)
388
+ assert_equal(0, model.changesets.count)
389
+
390
+ assert_raises do
391
+ @release.as_current do
392
+ model.skip_changeset do
393
+ model.update!(name: 'Baz')
394
+ raise 'test'
395
+ end
396
+ end
453
397
  end
454
398
 
455
- model.reload
456
- refute(model.activates_with_current_release?)
399
+ @release.as_current { model.update!(name: 'Qoo') }
400
+ assert_equal('Baz', model.reload.name)
401
+ assert_equal(1, model.changesets.count)
457
402
  end
458
403
 
459
- def test_creating_and_activating_embedded
460
- model = Foo.create!(name: 'Foo')
404
+ def test_changesets_with_children
405
+ model = Foo.create!(
406
+ name: 'Test',
407
+ bars: [{ name: 'Bar' }],
408
+ baz: { name: 'Baz' }
409
+ )
461
410
 
462
- embedded = Release.with_current(@release.id) do
463
- model.bars.create!(
464
- name: 'Test',
465
- active: true,
466
- activate_with: @release.id
467
- )
468
- end
411
+ assert_empty(model.changesets_with_children)
469
412
 
470
- model.reload
413
+ @release.as_current { model.update!(name: 'Test 2') }
414
+ assert_equal(model.changesets, model.changesets_with_children)
415
+
416
+ @release.as_current { model.bars.first.update!(name: 'Bar 2') }
417
+ assert_equal(2, model.changesets_with_children.size)
418
+ assert_includes(model.changesets_with_children, model.changesets.first)
419
+ assert_includes(model.changesets_with_children, model.bars.first.changesets.first)
471
420
 
472
- refute(embedded.active)
473
- assert_equal(1, embedded.changesets.length)
474
- assert_equal(@release.id, embedded.changesets.first.release_id)
475
- assert(embedded.changesets.first.changeset['active'])
476
- assert(embedded.changesets.first.document_path.present?)
421
+ @release.as_current { model.baz.update!(name: 'Baz 2') }
422
+ assert_equal(3, model.changesets_with_children.size)
423
+ assert_includes(model.changesets_with_children, model.changesets.first)
424
+ assert_includes(model.changesets_with_children, model.bars.first.changesets.first)
425
+ assert_includes(model.changesets_with_children, model.baz.changesets.first)
477
426
  end
478
427
  end
479
428
  end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class Release
5
+ class ChangesetTest < TestCase
6
+ def test_build_undo
7
+ releasable = create_page(name: 'Foo')
8
+ release = create_release
9
+ release.as_current { releasable.update_attributes!(name: 'Bar') }
10
+ changeset = release.changesets.first
11
+
12
+ undo = changeset.build_undo(release: create_release)
13
+ assert_equal(releasable, undo.releasable)
14
+ assert_equal(changeset.document_path, undo.document_path)
15
+ assert_match(/Foo/, undo.changeset.to_s)
16
+ assert_equal('Foo', releasable.name)
17
+
18
+ other_release = create_release
19
+ other_release.as_current { releasable.update_attributes!(name: 'Baz') }
20
+
21
+ other_release.as_current do
22
+ undo = changeset.build_undo(release: create_release)
23
+ assert_equal(releasable, undo.releasable)
24
+ assert_equal(changeset.document_path, undo.document_path)
25
+ assert_match(/Foo/, undo.changeset.to_s)
26
+ assert_equal('Foo', releasable.name)
27
+ end
28
+
29
+ other_release.update_attributes!(publish_at: 1.day.from_now)
30
+ release.update_attributes!(publish_at: 2.days.from_now)
31
+ changeset.reload
32
+
33
+ undo = changeset.build_undo(release: create_release)
34
+ assert_equal(releasable, undo.releasable)
35
+ assert_equal(changeset.document_path, undo.document_path)
36
+ assert_match(/Baz/, undo.changeset.to_s)
37
+ assert_equal('Foo', releasable.name)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class ReleaseJobsTest < TestCase
5
+ setup :setup_sidekiq
6
+ teardown :teardown_sidekiq
7
+
8
+ def setup_sidekiq
9
+ Sidekiq::Testing.disable!
10
+
11
+ @scheduled_set = Sidekiq::ScheduledSet.new
12
+ @scheduled_set.clear
13
+ end
14
+
15
+ def teardown_sidekiq
16
+ Sidekiq::Testing.inline!
17
+ end
18
+
19
+ def test_save_updates_the_publish_job
20
+ release = create_release
21
+ release.publish_at = Time.current + 1.month
22
+
23
+ release.save
24
+ release.reload
25
+
26
+ assert(release.publish_job_id.present?)
27
+ end
28
+
29
+ def test_save_does_not_save_the_publish_job_id_when_not_changing_publish_date
30
+ release = create_release
31
+ assert(release.publish_job_id.blank?)
32
+ assert_equal(0, @scheduled_set.size)
33
+ end
34
+
35
+ def test_removing_publish_at_removes_job
36
+ release = create_release(publish_at: 1.week.from_now)
37
+ assert(release.publish_job_id.present?)
38
+ assert_equal(1, @scheduled_set.size)
39
+
40
+ release.update_attributes!(publish_at: nil)
41
+ release.reload
42
+ assert(release.publish_job_id.blank?)
43
+ assert_equal(0, @scheduled_set.size)
44
+ end
45
+
46
+ def test_destroy_deletes_the_publish_job
47
+ release = create_release(publish_job_id: '1234')
48
+ release.destroy
49
+ assert_equal(0, @scheduled_set.size)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,43 @@
1
+
2
+ require 'test_helper'
3
+
4
+ module Workarea
5
+ class ReleasePreviewingTest < TestCase
6
+ class Foo
7
+ include Mongoid::Document
8
+ include Mongoid::Timestamps
9
+ include Releasable
10
+ field :name, type: String
11
+ field :description, type: String
12
+ end
13
+
14
+ def test_basic_previewing
15
+ first_release = create_release(publish_at: 1.day.from_now)
16
+ second_release = create_release(publish_at: 2.days.from_now)
17
+
18
+ model = Foo.create!(name: 'Test')
19
+ first_release.as_current do
20
+ model.name = 'Changed'
21
+ model.save!
22
+ end
23
+
24
+ model.reload
25
+ second_release.as_current do
26
+ model.description = 'Description'
27
+ model.save!
28
+ end
29
+
30
+ first_release.as_current do
31
+ model.reload
32
+ assert_equal('Changed', model.name)
33
+ assert_nil(model.description)
34
+ end
35
+
36
+ second_release.as_current do
37
+ model.reload
38
+ assert_equal('Changed', model.name)
39
+ assert_equal('Description', model.description)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -44,6 +44,16 @@ module Workarea
44
44
  end
45
45
  end
46
46
 
47
+ def test_scheduled
48
+ blank = create_release(publish_at: nil)
49
+ first = create_release(publish_at: 1.day.from_now)
50
+ second = create_release(publish_at: 2.days.from_now)
51
+ third = create_release(publish_at: 3.days.from_now)
52
+
53
+ assert_equal([first, second, third], Release.scheduled.desc(:publish_at))
54
+ assert_equal([first], Release.scheduled(before: 2.days.from_now))
55
+ end
56
+
47
57
  def test_unscheduled_does_not_return_scheduled_or_published_releases
48
58
  create_release(publish_at: Time.current + 1.week, published_at: nil)
49
59
  create_release(publish_at: nil, published_at: Time.current - 1.week)
@@ -100,57 +110,24 @@ module Workarea
100
110
  assert_equal([release_1, release_2, release_3], result)
101
111
  end
102
112
 
103
- def test_undone_within_includes_releases_within_a_specified_range
104
- create_release(publish_at: 1.month.from_now, undo_at: 2.months.from_now)
105
- release_2 = create_release(publish_at: 1.day.from_now, undo_at: 1.day.from_now)
106
-
107
- result = Release.undone_within(Time.current, 2.days.from_now)
108
- assert_equal([release_2], result)
109
- end
113
+ def test_sort_by_publish
114
+ first = create_release(publish_at: 1.day.from_now)
115
+ second = create_release(publish_at: 2.days.from_now)
116
+ third = create_release(publish_at: 3.days.from_now)
110
117
 
111
- def test_is_sorted_by_undone_undo_time
112
- release_3 = create_release(published_at: 1.hour.ago, undo_at: 1.hour.from_now)
113
- release_2 = create_release(published_at: 2.days.ago, undone_at: 1.day.ago)
114
- release_1 = create_release(published_at: 1.week.ago, undone_at: 2.days.ago)
118
+ assert_equal([first, second, third], Release.all.sort_by_publish)
115
119
 
116
- result = Release.undone_within(3.days.ago, 3.days.from_now)
117
- assert_equal([release_1, release_2, release_3], result)
120
+ fourth = create_release(publish_at: first.publish_at)
121
+ assert_equal([first, fourth, second, third], Release.all.sort_by_publish)
118
122
  end
119
123
 
120
124
  def test_publish_sets_publish_at_to_nil
121
- release = create_release(
122
- publish_at: 1.week.from_now,
123
- undone_at: 1.week.ago
124
- )
125
+ release = create_release(publish_at: 1.week.from_now)
125
126
  release.publish!
126
127
  release.reload
127
128
  assert(release.publish_at.blank?)
128
129
  end
129
130
 
130
- def test_publish_sets_undone_at_to_nil
131
- release = create_release(
132
- publish_at: 1.week.from_now,
133
- undone_at: 1.week.ago
134
- )
135
- release.publish!
136
- release.reload
137
- assert(release.undone_at.blank?)
138
- end
139
-
140
- def test_undo_sets_undo_at_to_nil_if_in_the_future
141
- release = create_release(undo_at: 1.week.from_now)
142
- release.undo!
143
- release.reload
144
- assert(release.undo_at.blank?)
145
- end
146
-
147
- def test_undo_sets_undone_at
148
- release = create_release
149
- release.undo!
150
- release.reload
151
- assert(release.undone_at.present?)
152
- end
153
-
154
131
  def test_scheduled
155
132
  release = Release.new
156
133
  refute(release.scheduled?)
@@ -183,133 +160,62 @@ module Workarea
183
160
  assert(release.published?)
184
161
  end
185
162
 
186
- def test_cannot_undo_without_scheduled_publish
187
- release = Release.new(name: 'Foo', undo_at: 2.hours.from_now)
163
+ def test_scheduled_before
164
+ one_week_from_now = 1.week.from_now
188
165
 
189
- refute(release.valid?, 'Release is valid with no publish date')
190
- assert_includes(release.errors.full_messages.to_sentence, I18n.t('workarea.errors.messages.undo_unpublished_release'))
166
+ one = create_release(publish_at: one_week_from_now)
167
+ two = create_release(publish_at: nil)
168
+ three = create_release(publish_at: 8.days.from_now)
169
+ four = create_release(publish_at: 6.days.from_now)
170
+ five = create_release(publish_at: one_week_from_now)
171
+ six = create_release(publish_at: 4.days.from_now)
191
172
 
192
- release.publish_at = 1.hour.from_now
193
-
194
- assert(release.valid?)
195
- assert(release.save!)
196
-
197
- release.publish_at = nil
198
- release.published_at = 1.hour.ago
199
-
200
- assert(release.save!)
201
-
202
- release.published_at = nil
203
-
204
- refute(release.valid?)
205
- assert_includes(release.errors.full_messages.to_sentence, I18n.t('workarea.errors.messages.undo_unpublished_release'))
173
+ assert_equal([six, four, five], one.scheduled_before)
174
+ assert_equal([], two.scheduled_before)
175
+ assert_equal([six, four, one, five], three.scheduled_before)
176
+ assert_equal([six], four.scheduled_before)
177
+ assert_equal([six, four, one], five.scheduled_before)
178
+ assert_equal([], six.scheduled_before)
206
179
  end
207
180
 
208
- def test_ordered_changesets
209
- release = create_release
210
- [
211
- { releasable_type: 'Workarea::Catalog::Category', releasable_id: '123' },
212
- { releasable_type: 'Workarea::Catalog::Product', releasable_id: 'PROD1' },
213
- { releasable_type: 'Workarea::Catalog::Variant', releasable_id: 'VAR1' },
214
- { releasable_type: 'Workarea::Content::Page', releasable_id: 'PAGE1' },
215
- { releasable_type: 'Workarea::Navigation::Menu', releasable_id: 'NAV1' },
216
- { releasable_type: 'Workarea::Content', releasable_id: 'CON1' },
217
- { releasable_type: 'Workarea::Search::Customization', releasable_id: 'CUS1' },
218
- { releasable_type: 'Workarea::Content::Block', releasable_id: 'BLC1' }
219
- ].each { |changeset| release.changesets.build(changeset) }
220
-
221
- assert_equal(
222
- %w(
223
- Workarea::Catalog::Variant
224
- Workarea::Catalog::Product
225
- Workarea::Content::Block
226
- Workarea::Content
227
- Workarea::Content::Page
228
- Workarea::Catalog::Category
229
- Workarea::Search::Customization
230
- Workarea::Navigation::Menu
231
- ),
232
- release.ordered_changesets.map(&:releasable_type)
233
- )
234
- end
235
- end
236
-
237
- class ReleaseJobsTest < TestCase
238
- setup :setup_sidekiq
239
- teardown :teardown_sidekiq
181
+ def test_scheduled_after
182
+ one_week_from_now = 1.week.from_now
240
183
 
241
- def setup_sidekiq
242
- Sidekiq::Testing.disable!
184
+ one = create_release(name: '1', publish_at: one_week_from_now)
185
+ two = create_release(name: '2', publish_at: nil)
186
+ three = create_release(name: '3', publish_at: 8.days.from_now)
187
+ four = create_release(name: '4', publish_at: 6.days.from_now)
188
+ five = create_release(name: '5', publish_at: one_week_from_now)
189
+ six = create_release(name: '6', publish_at: 4.days.from_now)
243
190
 
244
- @scheduled_set = Sidekiq::ScheduledSet.new
245
- @scheduled_set.clear
191
+ assert_equal([five, three], one.scheduled_after)
192
+ assert_equal([], two.scheduled_after)
193
+ assert_equal([], three.scheduled_after)
194
+ assert_equal([one, five, three], four.scheduled_after)
195
+ assert_equal([one, three], five.scheduled_after)
196
+ assert_equal([four, one, five, three], six.scheduled_after)
246
197
  end
247
198
 
248
- def teardown_sidekiq
249
- Sidekiq::Testing.inline!
250
- end
251
-
252
- def test_save_updates_the_publish_job
199
+ def test_previous
253
200
  release = create_release
254
- release.publish_at = Time.current + 1.month
201
+ assert_nil(release.previous)
255
202
 
256
- release.save
257
- release.reload
203
+ release.update_attributes!(publish_at: 1.week.from_now)
204
+ assert_nil(release.previous)
258
205
 
259
- assert(release.publish_job_id.present?)
260
- end
206
+ first = create_release(publish_at: 1.day.from_now)
207
+ assert_equal(first, release.previous)
261
208
 
262
- def test_save_does_not_save_the_publish_job_id_when_not_changing_publish_date
263
- release = create_release
264
- assert(release.publish_job_id.blank?)
265
- assert_equal(0, @scheduled_set.size)
209
+ third = create_release(publish_at: 2.days.from_now)
210
+ assert_equal(third, release.previous)
266
211
  end
267
212
 
268
- def test_removing_publish_at_removes_job
269
- release = create_release(publish_at: 1.week.from_now)
270
- assert(release.publish_job_id.present?)
271
- assert_equal(1, @scheduled_set.size)
272
-
273
- release.update_attributes!(publish_at: nil)
274
- release.reload
275
- assert(release.publish_job_id.blank?)
276
- assert_equal(0, @scheduled_set.size)
277
- end
278
-
279
- def test_save_updates_the_undo_job
280
- release = create_release(publish_at: 2.weeks.from_now, undo_at: 1.month.from_now)
281
-
282
- assert(release.undo_job_id.present?)
283
- end
284
-
285
- def test_save_does_not_save_the_undo_job_id_when_not_changing_undo_date
213
+ def test_build_undo
286
214
  release = create_release
287
- release.save
288
- assert(release.undo_job_id.blank?)
289
- assert_equal(0, @scheduled_set.size)
290
- end
291
-
292
- def test_removing_undo_at_removes_job
293
- release = create_release(publish_at: 1.week.from_now, undo_at: 2.weeks.from_now)
294
- assert(release.undo_job_id.present?)
295
- assert_equal(2, @scheduled_set.size)
296
-
297
- release.update_attributes!(undo_at: nil)
298
- release.reload
299
- assert(release.undo_job_id.blank?)
300
- assert_equal(1, @scheduled_set.size)
301
- end
302
-
303
- def test_destroy_deletes_the_publish_job
304
- release = create_release(publish_job_id: '1234')
305
- release.destroy
306
- assert_equal(0, @scheduled_set.size)
307
- end
308
-
309
- def test_destroy_deletes_the_undo_job
310
- release = create_release(undo_job_id: '1234')
311
- release.destroy
312
- assert_equal(0, @scheduled_set.size)
215
+ undo = release.build_undo
216
+ assert(undo.name.present?)
217
+ assert_equal(undo, release.undo)
218
+ assert_equal(release, undo.undoes)
313
219
  end
314
220
  end
315
221
  end