shoppper 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +22 -0
- data/app/assets/config/shopper_manifest.js +2 -0
- data/app/assets/javascripts/shopper/application.js +15 -0
- data/app/assets/stylesheets/shopper/application.css +15 -0
- data/app/commands/shopper/cart_page/add_product.rb +16 -0
- data/app/commands/shopper/cart_page/update_cart.rb +21 -0
- data/app/commands/shopper/cart_page/update_coupon.rb +51 -0
- data/app/commands/shopper/cart_page/update_order_items.rb +31 -0
- data/app/commands/shopper/checkout_page/add_checkout_addresses.rb +62 -0
- data/app/commands/shopper/checkout_page/add_checkout_delivery.rb +18 -0
- data/app/commands/shopper/checkout_page/add_checkout_payment.rb +19 -0
- data/app/commands/shopper/checkout_page/place_order.rb +40 -0
- data/app/commands/shopper/checkout_page/proceed_checkout.rb +14 -0
- data/app/commands/shopper/orders_page/get_orders.rb +34 -0
- data/app/controllers/shopper/cart_controller.rb +29 -0
- data/app/controllers/shopper/checkout_controller.rb +68 -0
- data/app/controllers/shopper/order_item_controller.rb +12 -0
- data/app/controllers/shopper/orders_controller.rb +19 -0
- data/app/controllers/shopper/shopper_controller.rb +4 -0
- data/app/decorators/concerns/shopper/caller_attachable.rb +24 -0
- data/app/decorators/concerns/shopper/view_helpers.rb +15 -0
- data/app/decorators/shopper/cart_page/coupon_decorator.rb +23 -0
- data/app/decorators/shopper/checkout_page/credit_card_decorator.rb +9 -0
- data/app/decorators/shopper/checkout_page/delivery_decorator.rb +28 -0
- data/app/decorators/shopper/items_table/item_decorator.rb +46 -0
- data/app/decorators/shopper/order_details/address_decorator.rb +19 -0
- data/app/decorators/shopper/order_details/order_decorator.rb +45 -0
- data/app/decorators/shopper/order_summary/order_decorator.rb +38 -0
- data/app/decorators/shopper/orders_page/order_decorator.rb +31 -0
- data/app/forms/shopper/address_form.rb +32 -0
- data/app/forms/shopper/coupon_form.rb +12 -0
- data/app/forms/shopper/credit_card_form.rb +36 -0
- data/app/helpers/shopper/application_helper.rb +4 -0
- data/app/jobs/shopper/application_job.rb +4 -0
- data/app/mailers/shopper/checkout_mailer.rb +9 -0
- data/app/models/concerns/shopper/order_aasm.rb +35 -0
- data/app/models/concerns/shopper/order_arithmetic_helpers.rb +24 -0
- data/app/models/concerns/shopper/order_item_arithmetic_helpers.rb +7 -0
- data/app/models/concerns/shopper/order_number.rb +13 -0
- data/app/models/concerns/shopper/order_product_helpers.rb +15 -0
- data/app/models/shopper/address.rb +12 -0
- data/app/models/shopper/application_record.rb +5 -0
- data/app/models/shopper/billing_address.rb +4 -0
- data/app/models/shopper/country.rb +11 -0
- data/app/models/shopper/coupon.rb +13 -0
- data/app/models/shopper/credit_card.rb +9 -0
- data/app/models/shopper/delivery.rb +24 -0
- data/app/models/shopper/order.rb +27 -0
- data/app/models/shopper/order_item.rb +18 -0
- data/app/models/shopper/shipping_address.rb +4 -0
- data/app/presenters/shopper/cart_page/cart_presenter.rb +34 -0
- data/app/presenters/shopper/checkout_page/address_step_presenter.rb +55 -0
- data/app/presenters/shopper/checkout_page/complete_step_presenter.rb +34 -0
- data/app/presenters/shopper/checkout_page/confirm_step_presenter.rb +20 -0
- data/app/presenters/shopper/checkout_page/delivery_step_presenter.rb +16 -0
- data/app/presenters/shopper/checkout_page/payment_step_presenter.rb +16 -0
- data/app/presenters/shopper/checkout_page/progress_presenter.rb +37 -0
- data/app/presenters/shopper/orders_page/order_presenter.rb +28 -0
- data/app/presenters/shopper/orders_page/orders_presenter.rb +17 -0
- data/app/services/shopper/checkout_manager.rb +55 -0
- data/app/validators/shopper/phone_validator.rb +11 -0
- data/app/views/shopper/cart/add_product.js.haml +3 -0
- data/app/views/shopper/cart/show.html.haml +22 -0
- data/app/views/shopper/checkout/_address_fields.html.haml +7 -0
- data/app/views/shopper/checkout/_layout.html.haml +12 -0
- data/app/views/shopper/checkout/address.html.haml +37 -0
- data/app/views/shopper/checkout/complete.html.haml +17 -0
- data/app/views/shopper/checkout/confirm.html.haml +6 -0
- data/app/views/shopper/checkout/delivery.html.haml +35 -0
- data/app/views/shopper/checkout/payment.html.haml +20 -0
- data/app/views/shopper/checkout_mailer/complete.html.haml +5 -0
- data/app/views/shopper/order_item/_table.html.haml +4 -0
- data/app/views/shopper/order_item/_table_desktop.html.haml +40 -0
- data/app/views/shopper/order_item/_table_phone.html.haml +30 -0
- data/app/views/shopper/orders/_details.html.haml +21 -0
- data/app/views/shopper/orders/_summary.html.haml +27 -0
- data/app/views/shopper/orders/index.html.haml +32 -0
- data/app/views/shopper/orders/show.html.haml +4 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20170126000000_create_shopper_countries.rb +11 -0
- data/db/migrate/20170127194802_create_shopper_addresses.rb +19 -0
- data/db/migrate/20170127194999_create_shopper_deliveries.rb +12 -0
- data/db/migrate/20170129160931_create_shopper_orders.rb +14 -0
- data/db/migrate/20170129162148_create_shopper_order_items.rb +14 -0
- data/db/migrate/20170220181741_create_shopper_coupons.rb +11 -0
- data/db/migrate/20170224112113_add_state_to_shopper_orders.rb +5 -0
- data/db/migrate/20170224174654_create_shopper_credit_cards.rb +15 -0
- data/lib/shopper.rb +18 -0
- data/lib/shopper/checkout_wizard.rb +43 -0
- data/lib/shopper/configuration.rb +22 -0
- data/lib/shopper/current_order.rb +47 -0
- data/lib/shopper/engine.rb +21 -0
- data/lib/shopper/model_methods.rb +35 -0
- data/lib/shopper/version.rb +3 -0
- data/lib/tasks/shopper_tasks.rake +4 -0
- data/spec/commands/add_product_spec.rb +39 -0
- data/spec/controllers/cart_controller_spec.rb +34 -0
- data/spec/controllers/order_item_controller_spec.rb +18 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/spec/dummy/app/assets/images/fallback/product_default.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +20 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/ability.rb +7 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/models/customer.rb +3 -0
- data/spec/dummy/app/models/product.rb +21 -0
- data/spec/dummy/app/views/layouts/application.html.haml +17 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/app/views/root/index.html +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +34 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +21 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +9 -0
- data/spec/dummy/config/database.ci.yml +7 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +86 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/simple_form.rb +169 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/locales/simple_form.en.yml +31 -0
- data/spec/dummy/config/puma.rb +47 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/db/migrate/20170405091757_create_products.rb +10 -0
- data/spec/dummy/db/migrate/20170405160406_create_customers.rb +11 -0
- data/spec/dummy/db/schema.rb +33 -0
- data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/spec/dummy/log/development.log +378 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-5/-5Q4Ub_11IMVDpGB1eI8cCVFFsUlJ8XHRzneSdfWwvA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-u/-uuoXn7BP51SPd9jCpfonUaE46sb8x-w0b34wwdHt9E.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0T/0T0Tt9dfVU3GpS08jbSmEA-3V9YEKDfIoSeIPwG-V5M.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0X/0XswbOgGjXmH1fo5xq93jNgHe48bthciRdbD6tnWCvo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1c/1ctUiWcG10n8KMVoiqAlIapKLbW5MDV1opGFwHsx34o.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2Z/2ZWFIlXKLDgIwGlnU7FU5aLf_Y1-m4KLYDXG0GdOvcc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2c/2cgrQmg7ldfRivjXyyPNEH2O9Kps6UbeJH-Y9H1GmAs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2l/2ltamKE3DUsifk0Gd4gmMxsgm5yKUZiNdhnSVHq_rVs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/31/312SvTp1rlNjttuCrjMR-sOiWZ8_7XmiagVfUeNAWfU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4G/4GIZLDG2a1lnDZF2QESc0VLN9oHXztGnjE-LhJAssbk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4R/4RE2lQ9Q_Khn7V4lGNDAW4xVGALXbiqnfOx-mXE831Q.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6U/6UKVmfPR7t8yUajbBceuWKaXogETyIV6Tbp0Mo8sR8A.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6Z/6Zs5ocm3aNgIQhqxQonxR7DfNzImkwFVBFsFSoXJ9nM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6bbfebueG2G5YjKNjtH5pwuc1LEJjKmfpIL4IREIArw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7n/7ncqaz_mmyCQD_AQHpvMs2GXmVS9ETbTrWhH7RWvuYg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7v/7vrAes6c_ihwe8jMx1yxyRDgWgAmDYBRMlsqqjlOA24.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8t/8tcTiIy9nbujTSsrbowd_m1ZDK-XWxe5KBzu4iWULdg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9H/9H8beH0fozTusUWWhP9agRzmmCJigE63QS3yN6USIVY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BX/BXeClZZ7pe07EVX5rjMY_bO_Ec1T114oejXtrS7DYLY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DN/DN6DwzYk58CqQliQANOOcf4LZ9NfwuROLMpG_aIn1iA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EF/EFDkZUV83NReWDmYJPAbH4QssV1WH7dhLAafE0jMdLE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F4/F4HRhWWKLcUlE_9fUDcNFndpclhItP7pzduMZ0u0zEg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F9/F95lTcrn4OEdV2-8CpWRA7Vo_g8Cyy46-JWOiLmNuZ8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G5/G52PYwE_K5U0GKtgEfZMMMxYvZn20YV8JnDsE8miA8U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GY/GYoI8lC94xLeXahTKQmXCYQmEcBTeJVY3rw4Ow29mAk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HI/HIQD3918XDGcbRA7DQnrUx7Ij6_KmqX7A6-Xg8cTgvs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IG/IGBxZd8bfUKXZ0qApnsHIDYrpmlGh4_stvNLwNClo-Q.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JZ/JZvskjPGda8b9BWf--ABB7K8u8eZWLEY_IGmIwN-lsM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LZ/LZtqwTyBeV780reoWMqU06rIHTuSggj_moLE9aZl4zc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MH/MHuhgGwsUMEUsXy-NMZLnq_3FmpwQ6Hr-x9Pj2Lg6jQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MW/MWqLf-tbtXiYTRmuVMVRXCVjAEX6LaEZGlVxS74nM-E.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OK/OKLY4QbXl_c1lHz1gm6tyYrpRIFU-014RSUQpb9fwyw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ok/OkpxMmj1ovAbbyXiexCJnj0apz54kz8iqahL4c1aXDo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QI/QI3sr401dtpp_Wc_mTpdvAI5bpraLUIIf8Mv2feBvEw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R0/R0TSIcvnfF3-QoBBBWQ32DiJLIR8D676f-SkUhprDK8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUX4wpSRbADt7-aSjvb97ICl-fCJjPZxe1MNF6pcGOo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/To/To0QY39VWI3mZb6XXZAgOQCJcEj0tv0BJmIiu2oNdbg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W9/W9krhTTy1IFXT5Q_rF4CifVRj4AVwKeE_F6pln8Rcmg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ws/Wsgy75qmOuCK1Vp25X17Py-pML-11GG3F3e-OYOsfGk.cache +4 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yb/YbBCKCjwVLMTjLflIx-p2w001jnZ2kVbDwnbDTh20ps.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zi/ZiHXd8AlVOwGmpnKoVXVS3EKEBdo1Ac-Zcp4eiCPnRQ.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_C/_CHENopb4h3hRBPr0mRRTtNBvd64WDGI5v5hMC7PYgs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a9/a94GSaPUyrAw0VlSAmwgl4iwDPatPtP7tsesOf07Fuo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bk/bkyxSPKtV8sC84dH7iq0OkFMQzLCJ7DjdUoC6wYHaAA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cE/cEQDNdSRl1tLTsWUUnyDWWXECh-MtIchaMG7PA2kuM8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ch/chgbSC87FkXFMbNWMZJAtU_euvqnCKdUcV4CAjuRZXg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dG/dGcYyTZ1x7nZldIv9CU9P6FILL3BZ_pHeJUEBXOFDtk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eH/eHNL12KXLctBrvH2X9flxNGA4GRJGoyLwqRrxOWLHss.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fm/fmL1Nfucs6nwuozNi61KJ6nEHU8mb3F2SieWSl1sgeY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gg/ggoM7JVi5PFoOTHQGrMmhFwnOSjd_RsNYmV9SpLGNPY.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iH/iHBHhxxOEBtpSeS0MFX4NL9vEfZMaQ72PxSXtbLy4pQ.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kQ/kQZ9KBvn5nS686f0v-15x3q-XPK9Puu03Od4FRDV_DY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ln/ln7-McEMuq67tYE86JS_5anWVQE-o7kjVzTfmJ-pfYU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n9/n9fyL8DlM6Ze117bMHweLE2x-4YM5aAW8cT3XYw-de8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nM/nMZGQCxEPqJUI3praZMAm-YNu7TdqkdDhx3WG6J1KLY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/op/opCcAQpH-enBbSXpi0u1AEuA_O2KBuVSFHXlgdw8dNg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qC/qCvelfVAvK45T3Goi7dqiicmsAKQoF9MkLAZtA4LVC0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qI/qIdIIo1-efJi3gqwWbkhmcDlc4qTwuolMYutSBGYrxw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qP/qPmv5snMrDw830S6hSICDcnIy7kVEWoFKXhGKT38lG4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qx/qxYROkyCYJzti8DI00LfLhgV7FZgHCmaUnCjB3ayfWM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdwXC49DcebjF5LPaEs1vqDXCWlq-32hHXfiKvjifno.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wg/wgn7xxwAmTkEhfWm8ujbjnId_c4MherEJuyXwkipOIg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7PYh8DJvPykcEqpVab2vcY9-GFz-3cqtoMlRAu94Uc.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xg/xgrrLe9BN5muIDu9b9ADzAJHJtZFmr-PlDUBSkdJTDM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z7/z79WysQah2YzrP7757RmZSO9M_8yzxDJPheGOhMjyXU.cache +1 -0
- data/spec/factories/addresses.rb +14 -0
- data/spec/factories/countries.rb +9 -0
- data/spec/factories/coupons.rb +10 -0
- data/spec/factories/credit_cards.rb +9 -0
- data/spec/factories/customer.rb +12 -0
- data/spec/factories/deliveries.rb +8 -0
- data/spec/factories/order_items.rb +7 -0
- data/spec/factories/orders.rb +42 -0
- data/spec/factories/product.rb +6 -0
- data/spec/features/cart_spec.rb +66 -0
- data/spec/features/checkout_spec.rb +53 -0
- data/spec/forms/credit_card_form_spec.rb +56 -0
- data/spec/models/customer_spec.rb +9 -0
- data/spec/models/product_spec.rb +7 -0
- data/spec/models/shopper/address_spec.rb +14 -0
- data/spec/models/shopper/billing_address_spec.rb +7 -0
- data/spec/models/shopper/country_spec.rb +10 -0
- data/spec/models/shopper/coupon_spec.rb +9 -0
- data/spec/models/shopper/credit_card_spec.rb +7 -0
- data/spec/models/shopper/delivery_spec.rb +28 -0
- data/spec/models/shopper/order_item_spec.rb +18 -0
- data/spec/models/shopper/order_spec.rb +105 -0
- data/spec/models/shopper/shipping_address_spec.rb +7 -0
- data/spec/rails_helper.rb +52 -0
- data/spec/services/checkout_manager_spec.rb +106 -0
- data/spec/spec_helper.rb +99 -0
- data/spec/support/capybara.rb +23 -0
- data/spec/support/database_cleaner.rb +44 -0
- data/spec/support/factory_girl.rb +3 -0
- data/spec/support/macroses/shared_macroses.rb +32 -0
- data/spec/support/macroses/stub_current_order.rb +18 -0
- data/spec/support/rails-controller-testing.rb +7 -0
- data/spec/support/shared_examples/addressable.rb +22 -0
- data/spec/support/shoulda_matchers.rb +4 -0
- data/spec/support/show_me_the_cookies.rb +3 -0
- 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,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,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,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,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,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
|