shoppper 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +22 -0
  5. data/app/assets/config/shopper_manifest.js +2 -0
  6. data/app/assets/javascripts/shopper/application.js +15 -0
  7. data/app/assets/stylesheets/shopper/application.css +15 -0
  8. data/app/commands/shopper/cart_page/add_product.rb +16 -0
  9. data/app/commands/shopper/cart_page/update_cart.rb +21 -0
  10. data/app/commands/shopper/cart_page/update_coupon.rb +51 -0
  11. data/app/commands/shopper/cart_page/update_order_items.rb +31 -0
  12. data/app/commands/shopper/checkout_page/add_checkout_addresses.rb +62 -0
  13. data/app/commands/shopper/checkout_page/add_checkout_delivery.rb +18 -0
  14. data/app/commands/shopper/checkout_page/add_checkout_payment.rb +19 -0
  15. data/app/commands/shopper/checkout_page/place_order.rb +40 -0
  16. data/app/commands/shopper/checkout_page/proceed_checkout.rb +14 -0
  17. data/app/commands/shopper/orders_page/get_orders.rb +34 -0
  18. data/app/controllers/shopper/cart_controller.rb +29 -0
  19. data/app/controllers/shopper/checkout_controller.rb +68 -0
  20. data/app/controllers/shopper/order_item_controller.rb +12 -0
  21. data/app/controllers/shopper/orders_controller.rb +19 -0
  22. data/app/controllers/shopper/shopper_controller.rb +4 -0
  23. data/app/decorators/concerns/shopper/caller_attachable.rb +24 -0
  24. data/app/decorators/concerns/shopper/view_helpers.rb +15 -0
  25. data/app/decorators/shopper/cart_page/coupon_decorator.rb +23 -0
  26. data/app/decorators/shopper/checkout_page/credit_card_decorator.rb +9 -0
  27. data/app/decorators/shopper/checkout_page/delivery_decorator.rb +28 -0
  28. data/app/decorators/shopper/items_table/item_decorator.rb +46 -0
  29. data/app/decorators/shopper/order_details/address_decorator.rb +19 -0
  30. data/app/decorators/shopper/order_details/order_decorator.rb +45 -0
  31. data/app/decorators/shopper/order_summary/order_decorator.rb +38 -0
  32. data/app/decorators/shopper/orders_page/order_decorator.rb +31 -0
  33. data/app/forms/shopper/address_form.rb +32 -0
  34. data/app/forms/shopper/coupon_form.rb +12 -0
  35. data/app/forms/shopper/credit_card_form.rb +36 -0
  36. data/app/helpers/shopper/application_helper.rb +4 -0
  37. data/app/jobs/shopper/application_job.rb +4 -0
  38. data/app/mailers/shopper/checkout_mailer.rb +9 -0
  39. data/app/models/concerns/shopper/order_aasm.rb +35 -0
  40. data/app/models/concerns/shopper/order_arithmetic_helpers.rb +24 -0
  41. data/app/models/concerns/shopper/order_item_arithmetic_helpers.rb +7 -0
  42. data/app/models/concerns/shopper/order_number.rb +13 -0
  43. data/app/models/concerns/shopper/order_product_helpers.rb +15 -0
  44. data/app/models/shopper/address.rb +12 -0
  45. data/app/models/shopper/application_record.rb +5 -0
  46. data/app/models/shopper/billing_address.rb +4 -0
  47. data/app/models/shopper/country.rb +11 -0
  48. data/app/models/shopper/coupon.rb +13 -0
  49. data/app/models/shopper/credit_card.rb +9 -0
  50. data/app/models/shopper/delivery.rb +24 -0
  51. data/app/models/shopper/order.rb +27 -0
  52. data/app/models/shopper/order_item.rb +18 -0
  53. data/app/models/shopper/shipping_address.rb +4 -0
  54. data/app/presenters/shopper/cart_page/cart_presenter.rb +34 -0
  55. data/app/presenters/shopper/checkout_page/address_step_presenter.rb +55 -0
  56. data/app/presenters/shopper/checkout_page/complete_step_presenter.rb +34 -0
  57. data/app/presenters/shopper/checkout_page/confirm_step_presenter.rb +20 -0
  58. data/app/presenters/shopper/checkout_page/delivery_step_presenter.rb +16 -0
  59. data/app/presenters/shopper/checkout_page/payment_step_presenter.rb +16 -0
  60. data/app/presenters/shopper/checkout_page/progress_presenter.rb +37 -0
  61. data/app/presenters/shopper/orders_page/order_presenter.rb +28 -0
  62. data/app/presenters/shopper/orders_page/orders_presenter.rb +17 -0
  63. data/app/services/shopper/checkout_manager.rb +55 -0
  64. data/app/validators/shopper/phone_validator.rb +11 -0
  65. data/app/views/shopper/cart/add_product.js.haml +3 -0
  66. data/app/views/shopper/cart/show.html.haml +22 -0
  67. data/app/views/shopper/checkout/_address_fields.html.haml +7 -0
  68. data/app/views/shopper/checkout/_layout.html.haml +12 -0
  69. data/app/views/shopper/checkout/address.html.haml +37 -0
  70. data/app/views/shopper/checkout/complete.html.haml +17 -0
  71. data/app/views/shopper/checkout/confirm.html.haml +6 -0
  72. data/app/views/shopper/checkout/delivery.html.haml +35 -0
  73. data/app/views/shopper/checkout/payment.html.haml +20 -0
  74. data/app/views/shopper/checkout_mailer/complete.html.haml +5 -0
  75. data/app/views/shopper/order_item/_table.html.haml +4 -0
  76. data/app/views/shopper/order_item/_table_desktop.html.haml +40 -0
  77. data/app/views/shopper/order_item/_table_phone.html.haml +30 -0
  78. data/app/views/shopper/orders/_details.html.haml +21 -0
  79. data/app/views/shopper/orders/_summary.html.haml +27 -0
  80. data/app/views/shopper/orders/index.html.haml +32 -0
  81. data/app/views/shopper/orders/show.html.haml +4 -0
  82. data/config/routes.rb +11 -0
  83. data/db/migrate/20170126000000_create_shopper_countries.rb +11 -0
  84. data/db/migrate/20170127194802_create_shopper_addresses.rb +19 -0
  85. data/db/migrate/20170127194999_create_shopper_deliveries.rb +12 -0
  86. data/db/migrate/20170129160931_create_shopper_orders.rb +14 -0
  87. data/db/migrate/20170129162148_create_shopper_order_items.rb +14 -0
  88. data/db/migrate/20170220181741_create_shopper_coupons.rb +11 -0
  89. data/db/migrate/20170224112113_add_state_to_shopper_orders.rb +5 -0
  90. data/db/migrate/20170224174654_create_shopper_credit_cards.rb +15 -0
  91. data/lib/shopper.rb +18 -0
  92. data/lib/shopper/checkout_wizard.rb +43 -0
  93. data/lib/shopper/configuration.rb +22 -0
  94. data/lib/shopper/current_order.rb +47 -0
  95. data/lib/shopper/engine.rb +21 -0
  96. data/lib/shopper/model_methods.rb +35 -0
  97. data/lib/shopper/version.rb +3 -0
  98. data/lib/tasks/shopper_tasks.rake +4 -0
  99. data/spec/commands/add_product_spec.rb +39 -0
  100. data/spec/controllers/cart_controller_spec.rb +34 -0
  101. data/spec/controllers/order_item_controller_spec.rb +18 -0
  102. data/spec/dummy/Rakefile +6 -0
  103. data/spec/dummy/app/assets/config/manifest.js +5 -0
  104. data/spec/dummy/app/assets/images/fallback/product_default.png +0 -0
  105. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  106. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  107. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  108. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  109. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  110. data/spec/dummy/app/controllers/application_controller.rb +20 -0
  111. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  112. data/spec/dummy/app/jobs/application_job.rb +2 -0
  113. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  114. data/spec/dummy/app/models/ability.rb +7 -0
  115. data/spec/dummy/app/models/application_record.rb +3 -0
  116. data/spec/dummy/app/models/customer.rb +3 -0
  117. data/spec/dummy/app/models/product.rb +21 -0
  118. data/spec/dummy/app/views/layouts/application.html.haml +17 -0
  119. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  120. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  121. data/spec/dummy/app/views/root/index.html +1 -0
  122. data/spec/dummy/bin/bundle +3 -0
  123. data/spec/dummy/bin/rails +4 -0
  124. data/spec/dummy/bin/rake +4 -0
  125. data/spec/dummy/bin/setup +34 -0
  126. data/spec/dummy/bin/update +29 -0
  127. data/spec/dummy/config.ru +5 -0
  128. data/spec/dummy/config/application.rb +21 -0
  129. data/spec/dummy/config/boot.rb +5 -0
  130. data/spec/dummy/config/cable.yml +9 -0
  131. data/spec/dummy/config/database.ci.yml +7 -0
  132. data/spec/dummy/config/database.yml +22 -0
  133. data/spec/dummy/config/environment.rb +5 -0
  134. data/spec/dummy/config/environments/development.rb +54 -0
  135. data/spec/dummy/config/environments/production.rb +86 -0
  136. data/spec/dummy/config/environments/test.rb +42 -0
  137. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  138. data/spec/dummy/config/initializers/assets.rb +11 -0
  139. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  140. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  141. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  142. data/spec/dummy/config/initializers/inflections.rb +16 -0
  143. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  144. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  145. data/spec/dummy/config/initializers/session_store.rb +3 -0
  146. data/spec/dummy/config/initializers/simple_form.rb +169 -0
  147. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  148. data/spec/dummy/config/locales/en.yml +23 -0
  149. data/spec/dummy/config/locales/simple_form.en.yml +31 -0
  150. data/spec/dummy/config/puma.rb +47 -0
  151. data/spec/dummy/config/routes.rb +4 -0
  152. data/spec/dummy/config/secrets.yml +22 -0
  153. data/spec/dummy/config/spring.rb +6 -0
  154. data/spec/dummy/db/migrate/20170405091757_create_products.rb +10 -0
  155. data/spec/dummy/db/migrate/20170405160406_create_customers.rb +11 -0
  156. data/spec/dummy/db/schema.rb +33 -0
  157. data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +13 -0
  158. data/spec/dummy/log/development.log +378 -0
  159. data/spec/dummy/public/404.html +67 -0
  160. data/spec/dummy/public/422.html +67 -0
  161. data/spec/dummy/public/500.html +66 -0
  162. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  163. data/spec/dummy/public/apple-touch-icon.png +0 -0
  164. data/spec/dummy/public/favicon.ico +0 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-5/-5Q4Ub_11IMVDpGB1eI8cCVFFsUlJ8XHRzneSdfWwvA.cache +0 -0
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-u/-uuoXn7BP51SPd9jCpfonUaE46sb8x-w0b34wwdHt9E.cache +1 -0
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0T/0T0Tt9dfVU3GpS08jbSmEA-3V9YEKDfIoSeIPwG-V5M.cache +2 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0X/0XswbOgGjXmH1fo5xq93jNgHe48bthciRdbD6tnWCvo.cache +3 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1c/1ctUiWcG10n8KMVoiqAlIapKLbW5MDV1opGFwHsx34o.cache +1 -0
  170. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2Z/2ZWFIlXKLDgIwGlnU7FU5aLf_Y1-m4KLYDXG0GdOvcc.cache +0 -0
  171. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2c/2cgrQmg7ldfRivjXyyPNEH2O9Kps6UbeJH-Y9H1GmAs.cache +1 -0
  172. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2l/2ltamKE3DUsifk0Gd4gmMxsgm5yKUZiNdhnSVHq_rVs.cache +0 -0
  173. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/31/312SvTp1rlNjttuCrjMR-sOiWZ8_7XmiagVfUeNAWfU.cache +1 -0
  174. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4G/4GIZLDG2a1lnDZF2QESc0VLN9oHXztGnjE-LhJAssbk.cache +1 -0
  175. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4R/4RE2lQ9Q_Khn7V4lGNDAW4xVGALXbiqnfOx-mXE831Q.cache +2 -0
  176. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6U/6UKVmfPR7t8yUajbBceuWKaXogETyIV6Tbp0Mo8sR8A.cache +2 -0
  177. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6Z/6Zs5ocm3aNgIQhqxQonxR7DfNzImkwFVBFsFSoXJ9nM.cache +1 -0
  178. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6bbfebueG2G5YjKNjtH5pwuc1LEJjKmfpIL4IREIArw.cache +1 -0
  179. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7n/7ncqaz_mmyCQD_AQHpvMs2GXmVS9ETbTrWhH7RWvuYg.cache +2 -0
  180. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7v/7vrAes6c_ihwe8jMx1yxyRDgWgAmDYBRMlsqqjlOA24.cache +3 -0
  181. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8t/8tcTiIy9nbujTSsrbowd_m1ZDK-XWxe5KBzu4iWULdg.cache +1 -0
  182. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9H/9H8beH0fozTusUWWhP9agRzmmCJigE63QS3yN6USIVY.cache +1 -0
  183. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BX/BXeClZZ7pe07EVX5rjMY_bO_Ec1T114oejXtrS7DYLY.cache +1 -0
  184. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DN/DN6DwzYk58CqQliQANOOcf4LZ9NfwuROLMpG_aIn1iA.cache +0 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EF/EFDkZUV83NReWDmYJPAbH4QssV1WH7dhLAafE0jMdLE.cache +0 -0
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F4/F4HRhWWKLcUlE_9fUDcNFndpclhItP7pzduMZ0u0zEg.cache +0 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F9/F95lTcrn4OEdV2-8CpWRA7Vo_g8Cyy46-JWOiLmNuZ8.cache +1 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G5/G52PYwE_K5U0GKtgEfZMMMxYvZn20YV8JnDsE8miA8U.cache +0 -0
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GY/GYoI8lC94xLeXahTKQmXCYQmEcBTeJVY3rw4Ow29mAk.cache +1 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HI/HIQD3918XDGcbRA7DQnrUx7Ij6_KmqX7A6-Xg8cTgvs.cache +1 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IG/IGBxZd8bfUKXZ0qApnsHIDYrpmlGh4_stvNLwNClo-Q.cache +0 -0
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JZ/JZvskjPGda8b9BWf--ABB7K8u8eZWLEY_IGmIwN-lsM.cache +0 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LZ/LZtqwTyBeV780reoWMqU06rIHTuSggj_moLE9aZl4zc.cache +1 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MH/MHuhgGwsUMEUsXy-NMZLnq_3FmpwQ6Hr-x9Pj2Lg6jQ.cache +1 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MW/MWqLf-tbtXiYTRmuVMVRXCVjAEX6LaEZGlVxS74nM-E.cache +0 -0
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OK/OKLY4QbXl_c1lHz1gm6tyYrpRIFU-014RSUQpb9fwyw.cache +1 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ok/OkpxMmj1ovAbbyXiexCJnj0apz54kz8iqahL4c1aXDo.cache +1 -0
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QI/QI3sr401dtpp_Wc_mTpdvAI5bpraLUIIf8Mv2feBvEw.cache +1 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R0/R0TSIcvnfF3-QoBBBWQ32DiJLIR8D676f-SkUhprDK8.cache +0 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUX4wpSRbADt7-aSjvb97ICl-fCJjPZxe1MNF6pcGOo.cache +1 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/To/To0QY39VWI3mZb6XXZAgOQCJcEj0tv0BJmIiu2oNdbg.cache +1 -0
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W9/W9krhTTy1IFXT5Q_rF4CifVRj4AVwKeE_F6pln8Rcmg.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ws/Wsgy75qmOuCK1Vp25X17Py-pML-11GG3F3e-OYOsfGk.cache +4 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yb/YbBCKCjwVLMTjLflIx-p2w001jnZ2kVbDwnbDTh20ps.cache +1 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zi/ZiHXd8AlVOwGmpnKoVXVS3EKEBdo1Ac-Zcp4eiCPnRQ.cache +2 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_C/_CHENopb4h3hRBPr0mRRTtNBvd64WDGI5v5hMC7PYgs.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a9/a94GSaPUyrAw0VlSAmwgl4iwDPatPtP7tsesOf07Fuo.cache +1 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bk/bkyxSPKtV8sC84dH7iq0OkFMQzLCJ7DjdUoC6wYHaAA.cache +1 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cE/cEQDNdSRl1tLTsWUUnyDWWXECh-MtIchaMG7PA2kuM8.cache +0 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ch/chgbSC87FkXFMbNWMZJAtU_euvqnCKdUcV4CAjuRZXg.cache +1 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dG/dGcYyTZ1x7nZldIv9CU9P6FILL3BZ_pHeJUEBXOFDtk.cache +1 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eH/eHNL12KXLctBrvH2X9flxNGA4GRJGoyLwqRrxOWLHss.cache +1 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fm/fmL1Nfucs6nwuozNi61KJ6nEHU8mb3F2SieWSl1sgeY.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gg/ggoM7JVi5PFoOTHQGrMmhFwnOSjd_RsNYmV9SpLGNPY.cache +2 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iH/iHBHhxxOEBtpSeS0MFX4NL9vEfZMaQ72PxSXtbLy4pQ.cache +3 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kQ/kQZ9KBvn5nS686f0v-15x3q-XPK9Puu03Od4FRDV_DY.cache +1 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ln/ln7-McEMuq67tYE86JS_5anWVQE-o7kjVzTfmJ-pfYU.cache +0 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n9/n9fyL8DlM6Ze117bMHweLE2x-4YM5aAW8cT3XYw-de8.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nM/nMZGQCxEPqJUI3praZMAm-YNu7TdqkdDhx3WG6J1KLY.cache +1 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
  222. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/op/opCcAQpH-enBbSXpi0u1AEuA_O2KBuVSFHXlgdw8dNg.cache +1 -0
  223. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qC/qCvelfVAvK45T3Goi7dqiicmsAKQoF9MkLAZtA4LVC0.cache +0 -0
  224. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qI/qIdIIo1-efJi3gqwWbkhmcDlc4qTwuolMYutSBGYrxw.cache +2 -0
  225. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qP/qPmv5snMrDw830S6hSICDcnIy7kVEWoFKXhGKT38lG4.cache +2 -0
  226. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qx/qxYROkyCYJzti8DI00LfLhgV7FZgHCmaUnCjB3ayfWM.cache +1 -0
  227. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdwXC49DcebjF5LPaEs1vqDXCWlq-32hHXfiKvjifno.cache +1 -0
  228. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wg/wgn7xxwAmTkEhfWm8ujbjnId_c4MherEJuyXwkipOIg.cache +1 -0
  229. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7PYh8DJvPykcEqpVab2vcY9-GFz-3cqtoMlRAu94Uc.cache +2 -0
  230. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xg/xgrrLe9BN5muIDu9b9ADzAJHJtZFmr-PlDUBSkdJTDM.cache +3 -0
  231. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z7/z79WysQah2YzrP7757RmZSO9M_8yzxDJPheGOhMjyXU.cache +1 -0
  232. data/spec/factories/addresses.rb +14 -0
  233. data/spec/factories/countries.rb +9 -0
  234. data/spec/factories/coupons.rb +10 -0
  235. data/spec/factories/credit_cards.rb +9 -0
  236. data/spec/factories/customer.rb +12 -0
  237. data/spec/factories/deliveries.rb +8 -0
  238. data/spec/factories/order_items.rb +7 -0
  239. data/spec/factories/orders.rb +42 -0
  240. data/spec/factories/product.rb +6 -0
  241. data/spec/features/cart_spec.rb +66 -0
  242. data/spec/features/checkout_spec.rb +53 -0
  243. data/spec/forms/credit_card_form_spec.rb +56 -0
  244. data/spec/models/customer_spec.rb +9 -0
  245. data/spec/models/product_spec.rb +7 -0
  246. data/spec/models/shopper/address_spec.rb +14 -0
  247. data/spec/models/shopper/billing_address_spec.rb +7 -0
  248. data/spec/models/shopper/country_spec.rb +10 -0
  249. data/spec/models/shopper/coupon_spec.rb +9 -0
  250. data/spec/models/shopper/credit_card_spec.rb +7 -0
  251. data/spec/models/shopper/delivery_spec.rb +28 -0
  252. data/spec/models/shopper/order_item_spec.rb +18 -0
  253. data/spec/models/shopper/order_spec.rb +105 -0
  254. data/spec/models/shopper/shipping_address_spec.rb +7 -0
  255. data/spec/rails_helper.rb +52 -0
  256. data/spec/services/checkout_manager_spec.rb +106 -0
  257. data/spec/spec_helper.rb +99 -0
  258. data/spec/support/capybara.rb +23 -0
  259. data/spec/support/database_cleaner.rb +44 -0
  260. data/spec/support/factory_girl.rb +3 -0
  261. data/spec/support/macroses/shared_macroses.rb +32 -0
  262. data/spec/support/macroses/stub_current_order.rb +18 -0
  263. data/spec/support/rails-controller-testing.rb +7 -0
  264. data/spec/support/shared_examples/addressable.rb +22 -0
  265. data/spec/support/shoulda_matchers.rb +4 -0
  266. data/spec/support/show_me_the_cookies.rb +3 -0
  267. metadata +855 -0
@@ -0,0 +1,22 @@
1
+ default: &default
2
+ adapter: postgresql
3
+ encoding: unicode
4
+ pool: 5
5
+ host: localhost
6
+ username: bookstore_engine
7
+ password: 'bookstore_engine'
8
+
9
+ development:
10
+ <<: *default
11
+ database: bookstore_engine_development
12
+
13
+ # Warning: The database defined as "test" will be erased and
14
+ # re-generated from your development database when you run "rake".
15
+ # Do not set this db to the same as development or production.
16
+ test:
17
+ <<: *default
18
+ database: bookstore_engine_test
19
+
20
+ production:
21
+ <<: *default
22
+ database: bookstore_engine_production
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative 'application'
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,54 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports.
13
+ config.consider_all_requests_local = true
14
+
15
+ # Enable/disable caching. By default caching is disabled.
16
+ if Rails.root.join('tmp/caching-dev.txt').exist?
17
+ config.action_controller.perform_caching = true
18
+
19
+ config.cache_store = :memory_store
20
+ config.public_file_server.headers = {
21
+ 'Cache-Control' => 'public, max-age=172800'
22
+ }
23
+ else
24
+ config.action_controller.perform_caching = false
25
+
26
+ config.cache_store = :null_store
27
+ end
28
+
29
+ # Don't care if the mailer can't send.
30
+ config.action_mailer.raise_delivery_errors = false
31
+
32
+ config.action_mailer.perform_caching = false
33
+
34
+ # Print deprecation notices to the Rails logger.
35
+ config.active_support.deprecation = :log
36
+
37
+ # Raise an error on page load if there are pending migrations.
38
+ config.active_record.migration_error = :page_load
39
+
40
+ # Debug mode disables concatenation and preprocessing of assets.
41
+ # This option may cause significant delays in view rendering with a large
42
+ # number of complex assets.
43
+ config.assets.debug = true
44
+
45
+ # Suppress logger output for asset requests.
46
+ config.assets.quiet = true
47
+
48
+ # Raises error for missing translations
49
+ # config.action_view.raise_on_missing_translations = true
50
+
51
+ # Use an evented file watcher to asynchronously detect changes in source code,
52
+ # routes, locales, etc. This feature depends on the listen gem.
53
+ # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
54
+ end
@@ -0,0 +1,86 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # Code is not reloaded between requests.
5
+ config.cache_classes = true
6
+
7
+ # Eager load code on boot. This eager loads most of Rails and
8
+ # your application in memory, allowing both threaded web servers
9
+ # and those relying on copy on write to perform better.
10
+ # Rake tasks automatically ignore this option for performance.
11
+ config.eager_load = true
12
+
13
+ # Full error reports are disabled and caching is turned on.
14
+ config.consider_all_requests_local = false
15
+ config.action_controller.perform_caching = true
16
+
17
+ # Disable serving static files from the `/public` folder by default since
18
+ # Apache or NGINX already handles this.
19
+ config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
20
+
21
+ # Compress JavaScripts and CSS.
22
+ config.assets.js_compressor = :uglifier
23
+ # config.assets.css_compressor = :sass
24
+
25
+ # Do not fallback to assets pipeline if a precompiled asset is missed.
26
+ config.assets.compile = false
27
+
28
+ # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
29
+
30
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
31
+ # config.action_controller.asset_host = 'http://assets.example.com'
32
+
33
+ # Specifies the header that your server uses for sending files.
34
+ # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
35
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
36
+
37
+ # Mount Action Cable outside main process or domain
38
+ # config.action_cable.mount_path = nil
39
+ # config.action_cable.url = 'wss://example.com/cable'
40
+ # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
41
+
42
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
43
+ # config.force_ssl = true
44
+
45
+ # Use the lowest log level to ensure availability of diagnostic information
46
+ # when problems arise.
47
+ config.log_level = :debug
48
+
49
+ # Prepend all log lines with the following tags.
50
+ config.log_tags = [ :request_id ]
51
+
52
+ # Use a different cache store in production.
53
+ # config.cache_store = :mem_cache_store
54
+
55
+ # Use a real queuing backend for Active Job (and separate queues per environment)
56
+ # config.active_job.queue_adapter = :resque
57
+ # config.active_job.queue_name_prefix = "dummy_#{Rails.env}"
58
+ config.action_mailer.perform_caching = false
59
+
60
+ # Ignore bad email addresses and do not raise email delivery errors.
61
+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
62
+ # config.action_mailer.raise_delivery_errors = false
63
+
64
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
65
+ # the I18n.default_locale when a translation cannot be found).
66
+ config.i18n.fallbacks = true
67
+
68
+ # Send deprecation notices to registered listeners.
69
+ config.active_support.deprecation = :notify
70
+
71
+ # Use default logging formatter so that PID and timestamp are not suppressed.
72
+ config.log_formatter = ::Logger::Formatter.new
73
+
74
+ # Use a different logger for distributed setups.
75
+ # require 'syslog/logger'
76
+ # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
77
+
78
+ if ENV["RAILS_LOG_TO_STDOUT"].present?
79
+ logger = ActiveSupport::Logger.new(STDOUT)
80
+ logger.formatter = config.log_formatter
81
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
82
+ end
83
+
84
+ # Do not dump schema after migrations.
85
+ config.active_record.dump_schema_after_migration = false
86
+ end
@@ -0,0 +1,42 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Do not eager load code on boot. This avoids loading your whole application
11
+ # just for the purpose of running a single test. If you are using a tool that
12
+ # preloads Rails for running tests, you may have to set it to true.
13
+ config.eager_load = false
14
+
15
+ # Configure public file server for tests with Cache-Control for performance.
16
+ config.public_file_server.enabled = true
17
+ config.public_file_server.headers = {
18
+ 'Cache-Control' => 'public, max-age=3600'
19
+ }
20
+
21
+ # Show full error reports and disable caching.
22
+ config.consider_all_requests_local = true
23
+ config.action_controller.perform_caching = false
24
+
25
+ # Raise exceptions instead of rendering exception templates.
26
+ config.action_dispatch.show_exceptions = false
27
+
28
+ # Disable request forgery protection in test environment.
29
+ config.action_controller.allow_forgery_protection = false
30
+ config.action_mailer.perform_caching = false
31
+
32
+ # Tell Action Mailer not to deliver emails to the real world.
33
+ # The :test delivery method accumulates sent emails in the
34
+ # ActionMailer::Base.deliveries array.
35
+ config.action_mailer.delivery_method = :test
36
+
37
+ # Print deprecation notices to the stderr.
38
+ config.active_support.deprecation = :stderr
39
+
40
+ # Raises error for missing translations
41
+ # config.action_view.raise_on_missing_translations = true
42
+ end
@@ -0,0 +1,6 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # ApplicationController.renderer.defaults.merge!(
4
+ # http_host: 'example.org',
5
+ # https: false
6
+ # )
@@ -0,0 +1,11 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Version of your assets, change this if you want to expire all your assets.
4
+ Rails.application.config.assets.version = '1.0'
5
+
6
+ # Add additional assets to the asset load path
7
+ # Rails.application.config.assets.paths << Emoji.images_path
8
+
9
+ # Precompile additional assets.
10
+ # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
11
+ # Rails.application.config.assets.precompile += %w( search.js )
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Specify a serializer for the signed and encrypted cookie jars.
4
+ # Valid options are :json, :marshal, and :hybrid.
5
+ Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Configure sensitive parameters which will be filtered from the log file.
4
+ Rails.application.config.filter_parameters += [:password]
@@ -0,0 +1,16 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format. Inflections
4
+ # are locale specific, and you may define rules for as many different
5
+ # locales as you wish. All of these examples are active by default:
6
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
7
+ # inflect.plural /^(ox)$/i, '\1en'
8
+ # inflect.singular /^(ox)en/i, '\1'
9
+ # inflect.irregular 'person', 'people'
10
+ # inflect.uncountable %w( fish sheep )
11
+ # end
12
+
13
+ # These inflection rules are supported but not enabled by default:
14
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
15
+ # inflect.acronym 'RESTful'
16
+ # end
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
@@ -0,0 +1,24 @@
1
+ # Be sure to restart your server when you modify this file.
2
+ #
3
+ # This file contains migration options to ease your Rails 5.0 upgrade.
4
+ #
5
+ # Read the Guide for Upgrading Ruby on Rails for more info on each option.
6
+
7
+ # Enable per-form CSRF tokens. Previous versions had false.
8
+ Rails.application.config.action_controller.per_form_csrf_tokens = true
9
+
10
+ # Enable origin-checking CSRF mitigation. Previous versions had false.
11
+ Rails.application.config.action_controller.forgery_protection_origin_check = true
12
+
13
+ # Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
14
+ # Previous versions had false.
15
+ ActiveSupport.to_time_preserves_timezone = true
16
+
17
+ # Require `belongs_to` associations by default. Previous versions had false.
18
+ Rails.application.config.active_record.belongs_to_required_by_default = true
19
+
20
+ # Do not halt callback chains when a callback returns false. Previous versions had true.
21
+ ActiveSupport.halt_callback_chains_on_return_false = false
22
+
23
+ # Configure SSL options to enable HSTS with subdomains. Previous versions had false.
24
+ Rails.application.config.ssl_options = { hsts: { subdomains: true } }
@@ -0,0 +1,3 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Rails.application.config.session_store :cookie_store, key: '_dummy_session'
@@ -0,0 +1,169 @@
1
+ # Use this setup block to configure all options available in SimpleForm.
2
+ SimpleForm.setup do |config|
3
+ # Wrappers are used by the form builder to generate a
4
+ # complete input. You can remove any component from the
5
+ # wrapper, change the order or even add your own to the
6
+ # stack. The options given below are used to wrap the
7
+ # whole input.
8
+ config.wrappers :default, class: :input,
9
+ hint_class: :field_with_hint, error_class: :field_with_errors do |b|
10
+ ## Extensions enabled by default
11
+ # Any of these extensions can be disabled for a
12
+ # given input by passing: `f.input EXTENSION_NAME => false`.
13
+ # You can make any of these extensions optional by
14
+ # renaming `b.use` to `b.optional`.
15
+
16
+ # Determines whether to use HTML5 (:email, :url, ...)
17
+ # and required attributes
18
+ b.use :html5
19
+
20
+ # Calculates placeholders automatically from I18n
21
+ # You can also pass a string as f.input placeholder: "Placeholder"
22
+ b.use :placeholder
23
+
24
+ ## Optional extensions
25
+ # They are disabled unless you pass `f.input EXTENSION_NAME => true`
26
+ # to the input. If so, they will retrieve the values from the model
27
+ # if any exists. If you want to enable any of those
28
+ # extensions by default, you can change `b.optional` to `b.use`.
29
+
30
+ # Calculates maxlength from length validations for string inputs
31
+ # and/or database column lengths
32
+ b.optional :maxlength
33
+
34
+ # Calculate minlength from length validations for string inputs
35
+ b.optional :minlength
36
+
37
+ # Calculates pattern from format validations for string inputs
38
+ b.optional :pattern
39
+
40
+ # Calculates min and max from length validations for numeric inputs
41
+ b.optional :min_max
42
+
43
+ # Calculates readonly automatically from readonly attributes
44
+ b.optional :readonly
45
+
46
+ ## Inputs
47
+ b.use :label_input
48
+ b.use :hint, wrap_with: { tag: :span, class: :hint }
49
+ b.use :error, wrap_with: { tag: :span, class: :error }
50
+
51
+ ## full_messages_for
52
+ # If you want to display the full error message for the attribute, you can
53
+ # use the component :full_error, like:
54
+ #
55
+ # b.use :full_error, wrap_with: { tag: :span, class: :error }
56
+ end
57
+
58
+ # The default wrapper to be used by the FormBuilder.
59
+ config.default_wrapper = :default
60
+
61
+ # Define the way to render check boxes / radio buttons with labels.
62
+ # Defaults to :nested for bootstrap config.
63
+ # inline: input + label
64
+ # nested: label > input
65
+ config.boolean_style = :nested
66
+
67
+ # Default class for buttons
68
+ config.button_class = 'btn'
69
+
70
+ # Method used to tidy up errors. Specify any Rails Array method.
71
+ # :first lists the first message for each field.
72
+ # Use :to_sentence to list all errors for each field.
73
+ # config.error_method = :first
74
+
75
+ # Default tag used for error notification helper.
76
+ config.error_notification_tag = :div
77
+
78
+ # CSS class to add for error notification helper.
79
+ config.error_notification_class = 'error_notification'
80
+
81
+ # ID to add for error notification helper.
82
+ # config.error_notification_id = nil
83
+
84
+ # Series of attempts to detect a default label method for collection.
85
+ # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
86
+
87
+ # Series of attempts to detect a default value method for collection.
88
+ # config.collection_value_methods = [ :id, :to_s ]
89
+
90
+ # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
91
+ # config.collection_wrapper_tag = nil
92
+
93
+ # You can define the class to use on all collection wrappers. Defaulting to none.
94
+ # config.collection_wrapper_class = nil
95
+
96
+ # You can wrap each item in a collection of radio/check boxes with a tag,
97
+ # defaulting to :span.
98
+ # config.item_wrapper_tag = :span
99
+
100
+ # You can define a class to use in all item wrappers. Defaulting to none.
101
+ # config.item_wrapper_class = nil
102
+
103
+ # How the label text should be generated altogether with the required text.
104
+ # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }
105
+
106
+ # You can define the class to use on all labels. Default is nil.
107
+ # config.label_class = nil
108
+
109
+ # You can define the default class to be used on forms. Can be overriden
110
+ # with `html: { :class }`. Defaulting to none.
111
+ # config.default_form_class = nil
112
+
113
+ # You can define which elements should obtain additional classes
114
+ # config.generate_additional_classes_for = [:wrapper, :label, :input]
115
+
116
+ # Whether attributes are required by default (or not). Default is true.
117
+ # config.required_by_default = true
118
+
119
+ # Tell browsers whether to use the native HTML5 validations (novalidate form option).
120
+ # These validations are enabled in SimpleForm's internal config but disabled by default
121
+ # in this configuration, which is recommended due to some quirks from different browsers.
122
+ # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
123
+ # change this configuration to true.
124
+ config.browser_validations = false
125
+
126
+ # Collection of methods to detect if a file type was given.
127
+ # config.file_methods = [ :mounted_as, :file?, :public_filename ]
128
+
129
+ # Custom mappings for input types. This should be a hash containing a regexp
130
+ # to match as key, and the input type that will be used when the field name
131
+ # matches the regexp as value.
132
+ # config.input_mappings = { /count/ => :integer }
133
+
134
+ # Custom wrappers for input types. This should be a hash containing an input
135
+ # type as key and the wrapper that will be used for all inputs with specified type.
136
+ # config.wrapper_mappings = { string: :prepend }
137
+
138
+ # Namespaces where SimpleForm should look for custom input classes that
139
+ # override default inputs.
140
+ # config.custom_inputs_namespaces << "CustomInputs"
141
+
142
+ # Default priority for time_zone inputs.
143
+ # config.time_zone_priority = nil
144
+
145
+ # Default priority for country inputs.
146
+ # config.country_priority = nil
147
+
148
+ # When false, do not use translations for labels.
149
+ # config.translate_labels = true
150
+
151
+ # Automatically discover new inputs in Rails' autoload path.
152
+ # config.inputs_discovery = true
153
+
154
+ # Cache SimpleForm inputs discovery
155
+ # config.cache_discovery = !Rails.env.development?
156
+
157
+ # Default class for inputs
158
+ # config.input_class = nil
159
+
160
+ # Define the default class of the input wrapper of the boolean input.
161
+ config.boolean_label_class = 'checkbox'
162
+
163
+ # Defines if the default input wrapper class should be included in radio
164
+ # collection wrappers.
165
+ # config.include_default_input_wrapper_class = true
166
+
167
+ # Defines which i18n scope will be used in Simple Form.
168
+ # config.i18n_scope = 'simple_form'
169
+ end