nimbleshop_core 0.0.1.rc1

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 (359) hide show
  1. data/README.md +13 -0
  2. data/Rakefile +15 -0
  3. data/app/assets/images/engines/nimbleshop_authorizedotnet/american_express.png +0 -0
  4. data/app/assets/images/engines/nimbleshop_authorizedotnet/authorize_net_big.png +0 -0
  5. data/app/assets/images/engines/nimbleshop_authorizedotnet/authorizedotnet_big.png +0 -0
  6. data/app/assets/images/engines/nimbleshop_authorizedotnet/discover.png +0 -0
  7. data/app/assets/images/engines/nimbleshop_authorizedotnet/mastercard.png +0 -0
  8. data/app/assets/images/engines/nimbleshop_authorizedotnet/visa.png +0 -0
  9. data/app/assets/images/engines/nimbleshop_cod/cod_small.png +0 -0
  10. data/app/assets/images/engines/nimbleshop_paypalwp/paypal_big.png +0 -0
  11. data/app/assets/images/engines/nimbleshop_paypalwp/paypal_small.png +0 -0
  12. data/app/assets/images/engines/nimbleshop_splitable/splitable.png +0 -0
  13. data/app/assets/images/engines/nimbleshop_splitable/splitable_big.png +0 -0
  14. data/app/assets/images/engines/nimbleshop_splitable/splitable_small.png +0 -0
  15. data/app/assets/javascripts/admin/products/edit.js.coffee +19 -0
  16. data/app/assets/javascripts/admin/shipping_methods/edit.js.coffee +6 -0
  17. data/app/assets/javascripts/admin.js +25 -0
  18. data/app/assets/javascripts/fadeout_success.js.coffee +2 -0
  19. data/app/assets/javascripts/payment_method.js.coffee +19 -0
  20. data/app/assets/javascripts/product-group-condition.js.coffee +33 -0
  21. data/app/assets/javascripts/remove_deletion_of_product_pictures.js.coffee +5 -0
  22. data/app/assets/javascripts/shipit.js.coffee +10 -0
  23. data/app/assets/javascripts/twitter_bootstrap.js.coffee +4 -0
  24. data/app/assets/stylesheets/admin.css +9 -0
  25. data/app/assets/stylesheets/admin_bootstrap_and_overrides.css.less +38 -0
  26. data/app/assets/stylesheets/admin_custom.css +104 -0
  27. data/app/assets/twitter/bootstrap/glyphicons-halflings-white.png +0 -0
  28. data/app/assets/twitter/bootstrap/glyphicons-halflings.png +0 -0
  29. data/app/controllers/admin/custom_fields_controller.rb +56 -0
  30. data/app/controllers/admin/link_groups_controller.rb +76 -0
  31. data/app/controllers/admin/main_controller.rb +9 -0
  32. data/app/controllers/admin/navigations_controller.rb +49 -0
  33. data/app/controllers/admin/orders_controller.rb +47 -0
  34. data/app/controllers/admin/payment_methods_controller.rb +26 -0
  35. data/app/controllers/admin/product_groups_controller.rb +70 -0
  36. data/app/controllers/admin/products_controller.rb +71 -0
  37. data/app/controllers/admin/shipments_controller.rb +19 -0
  38. data/app/controllers/admin/shipping_methods_controller.rb +93 -0
  39. data/app/controllers/admin/shipping_zones_controller.rb +62 -0
  40. data/app/controllers/admin/shops_controller.rb +33 -0
  41. data/app/controllers/admin_controller.rb +38 -0
  42. data/app/helpers/admin_helper.rb +83 -0
  43. data/app/helpers/nimbleshop_helper.rb +43 -0
  44. data/app/helpers/payment_method_helper.rb +52 -0
  45. data/app/mailers/admin_mailer.rb +22 -0
  46. data/app/mailers/mailer.rb +31 -0
  47. data/app/models/address.rb +69 -0
  48. data/app/models/country_shipping_zone.rb +36 -0
  49. data/app/models/creditcard.rb +95 -0
  50. data/app/models/custom_field.rb +8 -0
  51. data/app/models/custom_field_answer/field.rb +101 -0
  52. data/app/models/custom_field_answer.rb +17 -0
  53. data/app/models/line_item.rb +48 -0
  54. data/app/models/link.rb +3 -0
  55. data/app/models/link_group.rb +8 -0
  56. data/app/models/navigation.rb +7 -0
  57. data/app/models/order.rb +158 -0
  58. data/app/models/payment_method.rb +20 -0
  59. data/app/models/payment_transaction.rb +11 -0
  60. data/app/models/picture.rb +30 -0
  61. data/app/models/product.rb +76 -0
  62. data/app/models/product_group.rb +65 -0
  63. data/app/models/product_group_condition.rb +8 -0
  64. data/app/models/regional_shipping_zone.rb +25 -0
  65. data/app/models/shipment.rb +19 -0
  66. data/app/models/shipment_carrier.rb +3 -0
  67. data/app/models/shipping_cost_calculator.rb +9 -0
  68. data/app/models/shipping_method.rb +103 -0
  69. data/app/models/shipping_zone.rb +9 -0
  70. data/app/models/shop.rb +26 -0
  71. data/app/models/tax_calculator.rb +18 -0
  72. data/app/observers/order_observer.rb +53 -0
  73. data/app/uploaders/picture_uploader.rb +65 -0
  74. data/app/views/admin/custom_fields/_form.html.erb +45 -0
  75. data/app/views/admin/custom_fields/edit.html.erb +7 -0
  76. data/app/views/admin/custom_fields/index.html.erb +31 -0
  77. data/app/views/admin/custom_fields/new.html.erb +7 -0
  78. data/app/views/admin/link_groups/_form.html.erb +31 -0
  79. data/app/views/admin/link_groups/_link_group.html.erb +50 -0
  80. data/app/views/admin/link_groups/_link_group_title.html.erb +5 -0
  81. data/app/views/admin/link_groups/edit.html.erb +8 -0
  82. data/app/views/admin/link_groups/index.html.erb +29 -0
  83. data/app/views/admin/link_groups/new.html.erb +9 -0
  84. data/app/views/admin/mailer/new_order_notification.text.erb +31 -0
  85. data/app/views/admin/main/index.html.erb +5 -0
  86. data/app/views/admin/navigations/new.html.erb +29 -0
  87. data/app/views/admin/orders/_line_item.html.erb +11 -0
  88. data/app/views/admin/orders/_line_items.html.erb +39 -0
  89. data/app/views/admin/orders/_payment_info.html.erb +20 -0
  90. data/app/views/admin/orders/_shipping_info.html.erb +40 -0
  91. data/app/views/admin/orders/index.html.erb +33 -0
  92. data/app/views/admin/orders/show.html.erb +40 -0
  93. data/app/views/admin/payment_methods/index.html.erb +6 -0
  94. data/app/views/admin/product_groups/_condition.html.mustache +20 -0
  95. data/app/views/admin/product_groups/_form.html.erb +72 -0
  96. data/app/views/admin/product_groups/edit.html.erb +7 -0
  97. data/app/views/admin/product_groups/index.html.erb +30 -0
  98. data/app/views/admin/product_groups/new.html.erb +7 -0
  99. data/app/views/admin/product_groups/show.html.erb +9 -0
  100. data/app/views/admin/products/_custom_field_answer.html.erb +9 -0
  101. data/app/views/admin/products/_form.html.erb +69 -0
  102. data/app/views/admin/products/_handle_pictures.html.erb +32 -0
  103. data/app/views/admin/products/_pictures.html.erb +33 -0
  104. data/app/views/admin/products/edit.html.erb +26 -0
  105. data/app/views/admin/products/index.html.erb +34 -0
  106. data/app/views/admin/products/new.html.erb +9 -0
  107. data/app/views/admin/shipping_methods/_form.html.erb +58 -0
  108. data/app/views/admin/shipping_methods/_shipping_method.html.erb +31 -0
  109. data/app/views/admin/shipping_methods/edit.html.erb +18 -0
  110. data/app/views/admin/shipping_methods/new.html.erb +7 -0
  111. data/app/views/admin/shipping_zones/_form.html.erb +31 -0
  112. data/app/views/admin/shipping_zones/_shipping_method.html.erb +13 -0
  113. data/app/views/admin/shipping_zones/_shipping_zone.html.erb +47 -0
  114. data/app/views/admin/shipping_zones/edit.html.erb +8 -0
  115. data/app/views/admin/shipping_zones/index.html.erb +16 -0
  116. data/app/views/admin/shipping_zones/new.html.erb +8 -0
  117. data/app/views/admin/shops/edit.html.erb +119 -0
  118. data/app/views/layouts/_admin_footer.html.erb +23 -0
  119. data/app/views/layouts/_admin_sidebar.html.erb +0 -0
  120. data/app/views/layouts/_container.html.erb +33 -0
  121. data/app/views/layouts/_top_nav_bar.html.erb +30 -0
  122. data/app/views/layouts/admin.html.erb +35 -0
  123. data/app/views/layouts/payment_method.html.erb +12 -0
  124. data/app/views/mailer/order_notification_to_buyer.text.erb +31 -0
  125. data/app/views/mailer/shipment_notification_to_buyer.text.erb +34 -0
  126. data/config/initializers/001_settings_application.rb +10 -0
  127. data/config/initializers/002_load_core_extensions.rb +8 -0
  128. data/config/initializers/field_with_error.rb +2 -0
  129. data/config/initializers/strip_and_nullify.rb +13 -0
  130. data/config/initializers/time_formats.rb +1 -0
  131. data/config/locales/en.yml +61 -0
  132. data/config/routes.rb +56 -0
  133. data/db/development.sqlite3 +0 -0
  134. data/db/migrate/20111022144421_create_product_groups.rb +12 -0
  135. data/db/migrate/20111022144426_create_products.rb +16 -0
  136. data/db/migrate/20111022144653_create_orders.rb +21 -0
  137. data/db/migrate/20111022144725_create_line_items.rb +15 -0
  138. data/db/migrate/20111022234951_create_shops.rb +20 -0
  139. data/db/migrate/20111026193227_create_link_groups.rb +12 -0
  140. data/db/migrate/20111026193435_create_navigations.rb +10 -0
  141. data/db/migrate/20111031135810_create_links.rb +10 -0
  142. data/db/migrate/20111106193938_create_custom_fields.rb +10 -0
  143. data/db/migrate/20111106195112_create_custom_field_answers.rb +14 -0
  144. data/db/migrate/20111106201548_create_product_group_conditions.rb +12 -0
  145. data/db/migrate/20111107035350_create_creditcard_transactions.rb +15 -0
  146. data/db/migrate/20111109190754_create_addresses.rb +24 -0
  147. data/db/migrate/20111125173344_create_pictures.rb +16 -0
  148. data/db/migrate/20111201024408_create_shipping_methods.rb +16 -0
  149. data/db/migrate/20111202143154_create_shipping_zones.rb +17 -0
  150. data/db/migrate/20111203034020_create_payment_methods.rb +14 -0
  151. data/db/migrate/20111221190000_create_preferences.rb +14 -0
  152. data/db/migrate/20120105234047_create_shipments.rb +11 -0
  153. data/db/migrate/20120105234553_create_shipment_carriers.rb +11 -0
  154. data/db/migrate/20120606165355_create_delayed_jobs.rb +22 -0
  155. data/db/production.sqlite3 +0 -0
  156. data/db/schema.rb +265 -0
  157. data/db/seeds.rb +1 -0
  158. data/db/test.sqlite3 +0 -0
  159. data/lib/assets/javascripts/loading_state_for_buttons.js.coffee +3 -0
  160. data/lib/assets/javascripts/show_help_on_hover.js.coffee +2 -0
  161. data/lib/assets/javascripts/utils/autoresize.js.coffee +3 -0
  162. data/lib/assets/javascripts/utils/focus.js.coffee +3 -0
  163. data/lib/assets/javascripts/utils/formatNumber.js.coffee +25 -0
  164. data/lib/assets/javascripts/utils/formatPrice.js.coffee +24 -0
  165. data/lib/generators/nimbleshop/app/app_generator.rb +84 -0
  166. data/lib/generators/nimbleshop/app/templates/config/application.yml +61 -0
  167. data/lib/generators/nimbleshop/app/templates/config/initializers/airbrake.rb +3 -0
  168. data/lib/generators/nimbleshop/app/templates/config/initializers/cache_images.rb +4 -0
  169. data/lib/generators/nimbleshop/app/templates/config/initializers/carrierwave.rb +36 -0
  170. data/lib/generators/nimbleshop/app/templates/config/initializers/delayed_job.rb +15 -0
  171. data/lib/generators/nimbleshop/app/templates/config/initializers/setup_email.rb +24 -0
  172. data/lib/nimbleshop/core_ext/activerecord_base.rb +18 -0
  173. data/lib/nimbleshop/core_ext/filelessio.rb +4 -0
  174. data/lib/nimbleshop/core_ext/force_ssl.rb +26 -0
  175. data/lib/nimbleshop/core_ext/mustache_templater_handler.rb +10 -0
  176. data/lib/nimbleshop/engine.rb +23 -0
  177. data/lib/nimbleshop/permalink/builder.rb +46 -0
  178. data/lib/nimbleshop/processor/base.rb +51 -0
  179. data/lib/nimbleshop/processor.rb +3 -0
  180. data/lib/nimbleshop/product_group_search/base_field.rb +19 -0
  181. data/lib/nimbleshop/product_group_search/core_field_strategy.rb +31 -0
  182. data/lib/nimbleshop/product_group_search/custom_field_strategy.rb +39 -0
  183. data/lib/nimbleshop/product_group_search/date_field.rb +16 -0
  184. data/lib/nimbleshop/product_group_search/extension.rb +46 -0
  185. data/lib/nimbleshop/product_group_search/number_field.rb +17 -0
  186. data/lib/nimbleshop/product_group_search/text_field.rb +33 -0
  187. data/lib/nimbleshop/product_group_search.rb +74 -0
  188. data/lib/nimbleshop/sampledata/data.rb +246 -0
  189. data/lib/nimbleshop/sampledata/pictures/product1/pic1.jpg +0 -0
  190. data/lib/nimbleshop/sampledata/pictures/product2/pic1.jpg +0 -0
  191. data/lib/nimbleshop/sampledata/pictures/product2/pic2.jpg +0 -0
  192. data/lib/nimbleshop/sampledata/pictures/product3/pic1.jpg +0 -0
  193. data/lib/nimbleshop/sampledata/pictures/product3/pic2.jpg +0 -0
  194. data/lib/nimbleshop/sampledata/pictures/product3/pic3.jpg +0 -0
  195. data/lib/nimbleshop/sampledata/pictures/product3/pic4.jpg +0 -0
  196. data/lib/nimbleshop/sampledata/pictures/product3/pic5.jpg +0 -0
  197. data/lib/nimbleshop/sampledata/pictures/product4/pic1.jpg +0 -0
  198. data/lib/nimbleshop/sampledata/pictures/product4/pic2.jpg +0 -0
  199. data/lib/nimbleshop/sampledata/pictures/product5/pic1.jpg +0 -0
  200. data/lib/nimbleshop/sampledata/pictures/product5/pic2.jpg +0 -0
  201. data/lib/nimbleshop/sampledata/pictures/product6/pic1.jpg +0 -0
  202. data/lib/nimbleshop/sampledata/pictures/product6/pic10.jpg +0 -0
  203. data/lib/nimbleshop/sampledata/pictures/product6/pic11.jpg +0 -0
  204. data/lib/nimbleshop/sampledata/pictures/product6/pic12.jpg +0 -0
  205. data/lib/nimbleshop/sampledata/pictures/product6/pic13.jpg +0 -0
  206. data/lib/nimbleshop/sampledata/pictures/product6/pic14.jpg +0 -0
  207. data/lib/nimbleshop/sampledata/pictures/product6/pic15.jpg +0 -0
  208. data/lib/nimbleshop/sampledata/pictures/product6/pic16.jpg +0 -0
  209. data/lib/nimbleshop/sampledata/pictures/product6/pic17.jpg +0 -0
  210. data/lib/nimbleshop/sampledata/pictures/product6/pic2.jpg +0 -0
  211. data/lib/nimbleshop/sampledata/pictures/product6/pic3.jpg +0 -0
  212. data/lib/nimbleshop/sampledata/pictures/product6/pic4.jpg +0 -0
  213. data/lib/nimbleshop/sampledata/pictures/product6/pic5.jpg +0 -0
  214. data/lib/nimbleshop/sampledata/pictures/product6/pic6.jpg +0 -0
  215. data/lib/nimbleshop/sampledata/pictures/product6/pic7.jpg +0 -0
  216. data/lib/nimbleshop/sampledata/pictures/product6/pic8.jpg +0 -0
  217. data/lib/nimbleshop/sampledata/pictures/product6/pic9.jpg +0 -0
  218. data/lib/nimbleshop/sampledata/pictures/product7/pic1.jpg +0 -0
  219. data/lib/nimbleshop/sampledata/pictures/product7/pic2.jpg +0 -0
  220. data/lib/nimbleshop/sampledata/pictures/product7/pic3.jpg +0 -0
  221. data/lib/nimbleshop/sampledata/pictures/product8/pic1.jpg +0 -0
  222. data/lib/nimbleshop/sampledata/pictures/product8/pic2.jpg +0 -0
  223. data/lib/nimbleshop/sampledata/pictures/product8/pic3.jpg +0 -0
  224. data/lib/nimbleshop/sampledata/pictures/product8/pic4.jpg +0 -0
  225. data/lib/nimbleshop/sampledata/pictures/product8/pic5.jpg +0 -0
  226. data/lib/nimbleshop/sampledata/pictures/product8/pic6.jpg +0 -0
  227. data/lib/nimbleshop/sampledata/pictures/product8/pic7.jpg +0 -0
  228. data/lib/nimbleshop/sampledata/pictures/product8/pic8.jpg +0 -0
  229. data/lib/nimbleshop/sampledata/pictures/product9/pic1.jpg +0 -0
  230. data/lib/nimbleshop/sampledata/pictures/product9/pic2.jpg +0 -0
  231. data/lib/nimbleshop/util.rb +60 -0
  232. data/lib/nimbleshop/version.rb +18 -0
  233. data/lib/nimbleshop_core.rb +23 -0
  234. data/lib/tasks/localhost2public.rake +8 -0
  235. data/lib/tasks/setup.rake +26 -0
  236. data/test/factories/address_factory.rb +31 -0
  237. data/test/factories/creditcard_factory.rb +30 -0
  238. data/test/factories/custom_field_answer_factory.rb +6 -0
  239. data/test/factories/custom_field_factory.rb +21 -0
  240. data/test/factories/line_item_factory.rb +7 -0
  241. data/test/factories/link_factory.rb +6 -0
  242. data/test/factories/link_group_factory.rb +5 -0
  243. data/test/factories/navigation_factory.rb +6 -0
  244. data/test/factories/order_factory.rb +49 -0
  245. data/test/factories/payment_method_factory.rb +6 -0
  246. data/test/factories/payment_transaction_factory.rb +42 -0
  247. data/test/factories/picture_factory.rb +11 -0
  248. data/test/factories/product_group_condition_factory.rb +40 -0
  249. data/test/factories/product_group_factory.rb +5 -0
  250. data/test/factories/products_factory.rb +11 -0
  251. data/test/factories/shipment_carrier_factory.rb +6 -0
  252. data/test/factories/shipment_factory.rb +6 -0
  253. data/test/factories/shipping_method_factory.rb +15 -0
  254. data/test/factories/shipping_zone_factory.rb +5 -0
  255. data/test/factories/shop_factory.rb +8 -0
  256. data/test/fixtures/files/avatar.png +0 -0
  257. data/test/fixtures/link_groups.yml +13 -0
  258. data/test/fixtures/payment_methods.yml +39 -0
  259. data/test/fixtures/shops.yml +15 -0
  260. data/test/helpers/admin_helper_test.rb +37 -0
  261. data/test/helpers/nimbleshop_helper_test.rb +17 -0
  262. data/test/integration/admin/link_groups_acceptance_test.rb +39 -0
  263. data/test/integration/admin/orders_acceptance_test.rb +63 -0
  264. data/test/integration/admin/payment_methods_acceptance_test.rb +13 -0
  265. data/test/integration/admin/product_groups_acceptance_test.rb +89 -0
  266. data/test/integration/admin/products_acceptance_test.rb +105 -0
  267. data/test/integration/admin/shipping_methods_acceptance_test.rb +63 -0
  268. data/test/integration/admin/shipping_zones_acceptance_test.rb +16 -0
  269. data/test/integration/admin/shops_acceptance_test.rb +44 -0
  270. data/test/integration/checkout/cart_acceptance_test.rb +113 -0
  271. data/test/integration/checkout/payment_confirmation_acceptance_test.rb +24 -0
  272. data/test/integration/checkout/paypal_acceptance_test.rb +34 -0
  273. data/test/integration/checkout/shipping_address_acceptance_test.rb +91 -0
  274. data/test/integration/checkout/shipping_method_acceptance_test.rb +51 -0
  275. data/test/integration/homepage_acceptance_test.rb +24 -0
  276. data/test/integration/products_acceptance_test.rb +12 -0
  277. data/test/integration/static_pages_acceptance_test.rb +13 -0
  278. data/test/mailers/mailer_test.rb +25 -0
  279. data/test/rails_app/Gemfile +27 -0
  280. data/test/rails_app/Gemfile.lock +218 -0
  281. data/test/rails_app/Rakefile +10 -0
  282. data/test/rails_app/app/controllers/application_controller.rb +6 -0
  283. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  284. data/test/rails_app/app/views/layouts/application.html.erb +10 -0
  285. data/test/rails_app/config/application.rb +25 -0
  286. data/test/rails_app/config/application.yml +61 -0
  287. data/test/rails_app/config/boot.rb +5 -0
  288. data/test/rails_app/config/database.yml +18 -0
  289. data/test/rails_app/config/environment.rb +5 -0
  290. data/test/rails_app/config/environments/development.rb +18 -0
  291. data/test/rails_app/config/environments/production.rb +33 -0
  292. data/test/rails_app/config/environments/test.rb +33 -0
  293. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  294. data/test/rails_app/config/initializers/inflections.rb +2 -0
  295. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  296. data/test/rails_app/config/routes.rb +10 -0
  297. data/test/rails_app/config.ru +4 -0
  298. data/test/rails_app/db/development.sqlite3 +0 -0
  299. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  300. data/test/rails_app/db/schema.rb +52 -0
  301. data/test/rails_app/log/development.log +94 -0
  302. data/test/rails_app/log/test.log +0 -0
  303. data/test/rails_app/public/404.html +26 -0
  304. data/test/rails_app/public/422.html +26 -0
  305. data/test/rails_app/public/500.html +26 -0
  306. data/test/rails_app/public/favicon.ico +0 -0
  307. data/test/rails_app/script/rails +10 -0
  308. data/test/support/address_test_helper.rb +24 -0
  309. data/test/support/checkout_test_helper.rb +40 -0
  310. data/test/support/dbify_sql_helper.rb +12 -0
  311. data/test/support/images/cookware.jpg +0 -0
  312. data/test/support/must_be_like.rb +24 -0
  313. data/test/support/shipping_method_test_helper.rb +5 -0
  314. data/test/support/wait_for_ajax.rb +4 -0
  315. data/test/test_helper.rb +65 -0
  316. data/test/unit/address_test.rb +33 -0
  317. data/test/unit/country_shipping_zone_test.rb +17 -0
  318. data/test/unit/creditcard_test.rb +33 -0
  319. data/test/unit/custom_field_answer/field_test.rb +93 -0
  320. data/test/unit/order_test.rb +70 -0
  321. data/test/unit/payment_method/authorizedotnet_test.rb +21 -0
  322. data/test/unit/payment_method/paypalwp_test.rb +17 -0
  323. data/test/unit/payment_method/splitable_test.rb +18 -0
  324. data/test/unit/picture_test.rb +24 -0
  325. data/test/unit/processor/authorize_net_test.rb +236 -0
  326. data/test/unit/processor/paypal_test.rb +40 -0
  327. data/test/unit/processor/splitable_test.rb +123 -0
  328. data/test/unit/product_group_condition_test.rb +188 -0
  329. data/test/unit/product_group_test.rb +109 -0
  330. data/test/unit/product_test.rb +60 -0
  331. data/test/unit/shipping_cost_calculator_test.rb +19 -0
  332. data/test/unit/shipping_method_test.rb +197 -0
  333. data/test/unit/shop_test.rb +11 -0
  334. data/test/unit/tax_calculator_test.rb +13 -0
  335. data/test/vcr_cassettes/authorize_net/authorize-failure.yml +38 -0
  336. data/test/vcr_cassettes/authorize_net/authorize-success.yml +38 -0
  337. data/test/vcr_cassettes/authorize_net/capture-failure.yml +38 -0
  338. data/test/vcr_cassettes/authorize_net/capture-success.yml +38 -0
  339. data/test/vcr_cassettes/authorize_net/purchase-failure.yml +38 -0
  340. data/test/vcr_cassettes/authorize_net/purchase-success.yml +38 -0
  341. data/test/vcr_cassettes/authorize_net/refund-failure.yml +38 -0
  342. data/test/vcr_cassettes/authorize_net/refund-success.yml +38 -0
  343. data/test/vcr_cassettes/authorize_net/void-authorize.yml +38 -0
  344. data/test/vcr_cassettes/authorize_net/void-failure.yml +38 -0
  345. data/test/vcr_cassettes/authorize_net/void-success.yml +38 -0
  346. data/test/vcr_cassettes/splitable/split-create-failure.yml +48 -0
  347. data/test/vcr_cassettes/splitable/split-create-success.yml +50 -0
  348. data/test/vcr_cassettes/splitable/split-draft-create-failure.yml +50 -0
  349. data/test/vcr_cassettes/splitable/split-draft-create-success.yml +50 -0
  350. data/vendor/assets/javascripts/accounting.js +406 -0
  351. data/vendor/assets/javascripts/autoresize.js +275 -0
  352. data/vendor/assets/javascripts/jquery-1.7.1.js +9267 -0
  353. data/vendor/assets/javascripts/jquery-form.js +980 -0
  354. data/vendor/assets/javascripts/jquery-json.js +193 -0
  355. data/vendor/assets/javascripts/jquery-ui-1.8.16.js +11768 -0
  356. data/vendor/assets/javascripts/jquery-ujs.js +374 -0
  357. data/vendor/assets/javascripts/mustache.js +436 -0
  358. data/vendor/assets/javascripts/nested_form.js +51 -0
  359. metadata +740 -0
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :line_item do |f|
3
+ order
4
+ product
5
+ quantity 1
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :link do
3
+ sequence(:name) { |t| "name#{t}" }
4
+ url 'http://www.gogole.com/'
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :link_group do
3
+ sequence(:name) { |t| "name#{t}" }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :navigation do
3
+ link_group
4
+ product_group
5
+ end
6
+ end
@@ -0,0 +1,49 @@
1
+ FactoryGirl.define do
2
+ factory :order do |f|
3
+ email 'john@nimbleshop.com'
4
+ shipping_address
5
+ association :shipping_method, factory: :country_shipping_method
6
+ sequence(:number) { |t| "xxx#{t}" }
7
+
8
+ trait :line_items do
9
+ after(:create) { |order| FactoryGirl.create(:line_item, order: order) }
10
+ end
11
+
12
+ trait :splitable do
13
+ payment_method_id 1
14
+ end
15
+
16
+ trait :paypalwp do
17
+ payment_method_id 2
18
+ end
19
+
20
+ trait :authorizedotnet do
21
+ payment_method_id 3
22
+ end
23
+
24
+ trait :shipment do
25
+ after(:create) { |order| FactoryGirl.create(:shipment, order: order) }
26
+ end
27
+
28
+ factory :order_with_line_items, traits: [:line_items]
29
+
30
+ factory :order_paid_using_splitable, traits: [:splitable] do |order|
31
+ order.after(:create) do |o|
32
+ create :payment_transaction_with_splitable, order: o
33
+ end
34
+ end
35
+
36
+ factory :order_paid_using_paypalwp, traits: [:paypalwp] do |order|
37
+ order.after(:create) do |o|
38
+ create :payment_transaction_with_paypalwp, order: o
39
+ end
40
+ end
41
+
42
+ factory :order_paid_using_authorizedotnet, traits: [:authorizedotnet, :shipment] do |order|
43
+ order.after(:create) do |o|
44
+ create :payment_transaction_with_authorizedotnet, order: o
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :payment_method do |f|
3
+ name 'Cash'
4
+ permalink 'cash'
5
+ end
6
+ end
@@ -0,0 +1,42 @@
1
+ FactoryGirl.define do
2
+ factory :payment_transaction do
3
+
4
+ order
5
+
6
+ trait :splitable do
7
+ transaction_gid "42826554YH061931A"
8
+ success 't'
9
+ operation 'purchased'
10
+ end
11
+
12
+ trait :paypalwp do
13
+ transaction_gid "42826554YH061931A"
14
+ success 't'
15
+ operation 'purchased'
16
+ amount 14237
17
+ end
18
+
19
+ trait :authorizedotnet do
20
+ success 't'
21
+ operation 'authorized'
22
+ amount 11200
23
+ transaction_gid "2172281042"
24
+ params do
25
+ { response_code: 1,
26
+ response_reason_code: "1",
27
+ response_reason_text: "This transaction has been approved.",
28
+ avs_result_code: "Y",
29
+ transaction_id: "2172281042",
30
+ card_code: "P" }
31
+ end
32
+ metadata do
33
+ { card_number: 'XXXX-XXXX-XXXX-0027', cardtype: 'visaa' }
34
+ end
35
+ end
36
+
37
+ factory :payment_transaction_with_splitable, traits: [ :splitable ]
38
+ factory :payment_transaction_with_paypalwp, traits: [ :paypalwp ]
39
+ factory :payment_transaction_with_authorizedotnet, traits: [ :authorizedotnet ]
40
+
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ include ActionDispatch::TestProcess
2
+
3
+ FactoryGirl.define do
4
+ factory :picture do |f|
5
+ picture { fixture_file_upload(Rails.root.join('..', 'nimbleshop_core', 'test', 'fixtures', 'files', 'avatar.png'), 'image/png') }
6
+ product
7
+ file_name nil
8
+ content_type nil
9
+ file_size nil
10
+ end
11
+ end
@@ -0,0 +1,40 @@
1
+ FactoryGirl.define do
2
+ factory :product_group_condition do
3
+
4
+ trait :price_condition do
5
+ name :price
6
+ operator 'lt'
7
+ value 43
8
+ end
9
+
10
+ trait :name_condition do
11
+ name :name
12
+ operator 'starts'
13
+ value 'george'
14
+ end
15
+
16
+ trait :text_condition do
17
+ name { FactoryGirl.create(:text_custom_field).id }
18
+ operator 'starts'
19
+ value 'george'
20
+ end
21
+
22
+ trait :number_condition do
23
+ name { FactoryGirl.create(:number_custom_field).id }
24
+ operator 'lt'
25
+ value 43
26
+ end
27
+
28
+ trait :date_condition do
29
+ name { FactoryGirl.create(:date_custom_field).id }
30
+ operator 'gt'
31
+ value { '1/1/2001' }
32
+ end
33
+
34
+ factory :date_group_condition, traits: [ :date_condition ]
35
+ factory :text_group_condition, traits: [ :text_condition ]
36
+ factory :number_group_condition, traits: [ :number_condition ]
37
+ factory :price_group_condition, traits: [ :price_condition ]
38
+ factory :name_group_condition, traits: [ :name_condition ]
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :product_group do
3
+ sequence(:name) { |t| "name#{t}" }
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ FactoryGirl.define do
2
+ factory :product do
3
+ sequence(:name) { |t| "name#{t}" }
4
+ sequence(:description) { |t| "This is product description#{t}" }
5
+ price 50
6
+
7
+ # When a product is created through admin interface then carrierwave creates a record for each product
8
+ # even if no picture is uploaded
9
+ after(:create) { |product| product.pictures.create }
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :shipment_carrier do
3
+ sequence(:name) { |t| "UPS#{t}" }
4
+ end
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :shipment do
3
+ order
4
+ shipment_carrier
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :shipping_method do
3
+ sequence(:name) { |t| "name#{t}" }
4
+ active true
5
+
6
+ trait :country do
7
+ association :shipping_zone, factory: :country_shipping_zone
8
+ minimum_order_amount 0
9
+ maximum_order_amount 99999
10
+ base_price 2.99
11
+ end
12
+
13
+ factory :country_shipping_method, traits: [:country]
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :country_shipping_zone do |f|
3
+ country_code "US"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :shop do |f|
3
+ sequence(:name){|n| "store-#{n}"}
4
+ twitter_handle '@nimbleshop'
5
+ from_email 'support@nimbleshop.com'
6
+ end
7
+ end
8
+
Binary file
@@ -0,0 +1,13 @@
1
+ ---
2
+ link_groups_001:
3
+ id: "1"
4
+ name: Shop by price
5
+ permalink: shop-by-price
6
+ created_at: 2012-04-05 01:42:00.853498
7
+ updated_at: 2012-04-05 01:42:00.853498
8
+ link_groups_002:
9
+ id: "2"
10
+ name: Shop by category
11
+ permalink: shop-by-category
12
+ created_at: 2012-04-05 01:42:01.033504
13
+ updated_at: 2012-04-05 01:42:01.033504
@@ -0,0 +1,39 @@
1
+ ---
2
+ payment_methods_001:
3
+ id: "1"
4
+ name: Splitable
5
+ description: <p> Splitable helps split the cost of product with friends and family. </p> <p> <a href="http://splitable.com"> more information </a> </p>
6
+ type: NimbleshopSplitable::Splitable
7
+ permalink: splitable
8
+ metadata: "--- \n\
9
+ :api_secret: edb5fd7b39652986\n\
10
+ :expires_in: 24\n\
11
+ :mode: test\n\
12
+ :logo_url: http://edibleapple.com/wp-content/uploads/2009/04/silver-apple-logo.png\n\
13
+ :api_key: edb5fd7b39652986\n"
14
+ created_at: 2012-04-05 01:42:00.092168
15
+ updated_at: 2012-04-05 01:42:00.095526
16
+ payment_methods_002:
17
+ id: "2"
18
+ name: Paypal website payments standard
19
+ description: <p> Paypal website payments standard is a payment solution provided by paypal which allows merchant to accept credit card and paypal payments. There is no monthly fee and no setup fee by paypal for this account. </p> <p> <a href='https://merchant.paypal.com/cgi-bin/marketingweb?cmd=_render-content&content_ID=merchant/wp_standard&nav=2.1.0'> more information </a> </p>
20
+ type: NimbleshopPaypalwp::Paypalwp
21
+ permalink: paypalwp
22
+ metadata: "--- \n\
23
+ :mode: test\n\
24
+ :merchant_email: seller_1323037155_biz@bigbinary.com\n"
25
+ created_at: 2012-04-05 01:42:00.13064
26
+ updated_at: 2012-04-05 01:42:00.133581
27
+ payment_methods_003:
28
+ id: "3"
29
+ name: Authorize.net
30
+ description: <p> Authorize.Net is a payment gateway service provider allowing merchants to accept credit card and electronic checks paymentsn. Authorize.Net claims a user base of over 305,000 merchants, which would make them the Internet's largest payment gateway service provider. </p> <p> It also provides an instant test account which you can use while your application is being processed. </p>
31
+ type: NimbleshopAuthorizedotnet::Authorizedotnet
32
+ permalink: authorizedotnet
33
+ metadata: "--- \n\
34
+ :login_id: 26Daqx7Jtw7R\n\
35
+ :mode: test\n\
36
+ :transaction_key: 66JWf57KKc82W9y6\n\
37
+ :company_name_on_creditcard_statement: Nimbleshop LLC\n"
38
+ created_at: 2012-04-05 01:42:00.113269
39
+ updated_at: 2012-04-05 01:42:00.117875
@@ -0,0 +1,15 @@
1
+ ---
2
+ shops_001:
3
+ id: "1"
4
+ name: nimbleShop
5
+ theme: simply
6
+ time_zone: UTC
7
+ from_email: support@nimbleshop.com
8
+ default_creditcard_action: authorize
9
+ phone_number: 800-456-7890
10
+ twitter_handle: nimbleshop
11
+ facebook_url: http://www.facebook.com/pages/NimbleSHOP/119319381517845
12
+ google_analytics_tracking_id: ABCDSW
13
+ tax_percentage: "1.23"
14
+ created_at: 2012-04-05 01:42:00.726194
15
+ updated_at: 2012-04-05 01:42:00.726194
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class AdminHelperTest < ActiveRecord::TestCase
4
+
5
+ def helper
6
+ Class.new(ActionView::Base) do
7
+ include AdminHelper
8
+ end.new
9
+ end
10
+
11
+ test "admin_products_path" do
12
+ assert helper.admin_topbar_active?('admin_products_path', 'admin/products')
13
+ refute helper.admin_topbar_active?('admin_products_path', 'admin/orders')
14
+
15
+ assert helper.admin_topbar_active?('admin_custom_fields_path', 'admin/custom_fields')
16
+ refute helper.admin_topbar_active?('admin_custom_fields_path', 'admin/orders')
17
+
18
+ assert helper.admin_topbar_active?('admin_product_groups_path', 'admin/product_groups')
19
+ refute helper.admin_topbar_active?('admin_product_groups_path', 'admin/orders')
20
+
21
+ assert helper.admin_topbar_active?('admin_link_groups_path', 'admin/link_groups')
22
+ refute helper.admin_topbar_active?('admin_link_groups_path', 'admin/orders')
23
+
24
+ assert helper.admin_topbar_active?('admin_shipping_zones_path', 'admin/shipping_zones')
25
+ assert helper.admin_topbar_active?('admin_shipping_zones_path', 'admin/shipping_methods')
26
+ refute helper.admin_topbar_active?('admin_shipping_zones_path', 'admin/orders')
27
+
28
+ assert helper.admin_topbar_active?('admin_payment_methods_path', 'admin/payment_methods')
29
+ refute helper.admin_topbar_active?('admin_payment_methods_path', 'admin/orders')
30
+
31
+ assert helper.admin_topbar_active?('edit_admin_shop_path', 'admin/shops')
32
+ refute helper.admin_topbar_active?('edit_admin_shop_path', 'admin/orders')
33
+
34
+ assert helper.admin_topbar_active?('admin_orders_path', 'admin/orders')
35
+ end
36
+
37
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class NimbleshopHelperTest < ActiveRecord::TestCase
4
+
5
+ def helper
6
+ Class.new(ActionView::Base) do
7
+ include ::NimbleshopHelper
8
+ end.new
9
+ end
10
+
11
+ test "display_address" do
12
+ addr = create :address, address1: "<script>alert('hi')</script>"
13
+ output = helper.display_address(addr)
14
+ refute output.include?('<script>')
15
+ end
16
+
17
+ end
@@ -0,0 +1,39 @@
1
+ require "test_helper"
2
+
3
+ class LinkGroupsAcceptanceTest < ActionDispatch::IntegrationTest
4
+
5
+ setup do
6
+ @product_group = create :product_group, name: "Nike Shoes"
7
+ @link_group = create :link_group, name: "Branded Shoes"
8
+ end
9
+
10
+ test "add a new link group" do
11
+ visit admin_path
12
+ click_link 'Link groups'
13
+ click_link 'add_new_link_group'
14
+ fill_in 'link_group_name', with: 'Popular products'
15
+ click_button 'Submit'
16
+ assert page.has_content?('Successfully added')
17
+ assert page.has_content?('Popular products')
18
+ end
19
+
20
+ test "add new link" do
21
+ visit admin_path
22
+ click_link 'Link groups'
23
+ refute page.has_content?('Nike Shoes')
24
+ click_link 'Add new link'
25
+ select "Nike Shoes", from: 'Product Group'
26
+ click_button "Add"
27
+ assert page.has_content?('Nike Shoes')
28
+ end
29
+
30
+ test "delete link group" do
31
+ nav = @link_group.navigations.create(product_group: @product_group)
32
+ Capybara.current_driver = :selenium
33
+ visit admin_link_groups_path
34
+ page.evaluate_script('window.confirm = function() { return true; }')
35
+ find("a[href='#{admin_link_group_navigation_path(link_group_id: @link_group, id: nav)}']").click
36
+ assert page.has_content?('Successfully deleted')
37
+ end
38
+
39
+ end
@@ -0,0 +1,63 @@
1
+ require "test_helper"
2
+
3
+ class OrdersAcceptanceTest < ActionDispatch::IntegrationTest
4
+
5
+ test "paid using splitable" do
6
+ order = create(:order_paid_using_splitable, payment_status: 'purchased')
7
+
8
+ visit admin_path
9
+ click_link 'Orders'
10
+
11
+ click_link order.number
12
+ assert page.has_content?('Splitable')
13
+ end
14
+
15
+ test "paid using paypalwp" do
16
+ order = create(:order_paid_using_paypalwp, payment_status: 'purchased')
17
+
18
+ visit admin_path
19
+ click_link 'Orders'
20
+
21
+ click_link order.number
22
+ assert page.has_content?('Paypal website payments standard')
23
+ end
24
+
25
+ test "paid using authorize.net" do
26
+ order = create(:order_paid_using_authorizedotnet, payment_status: 'authorized')
27
+
28
+ visit admin_path
29
+ click_link 'Orders'
30
+
31
+ click_link order.number
32
+ assert page.has_content?('Authorize.net')
33
+ assert page.has_content?('Payment status AUTHORIZED')
34
+ end
35
+
36
+ test "payment status abandoned" do
37
+ order = build :order, email: nil, shipping_address: nil, shipping_method: nil
38
+ order.save(validate: false)
39
+
40
+ visit admin_path
41
+ click_link 'Orders'
42
+
43
+ assert page.has_css?('h1.ns-page-title', text: 'Orders')
44
+ click_link Order.first.number
45
+ assert page.has_content?('Payment status ABANDONED')
46
+ end
47
+
48
+ test "show order with line item and product is deleted" do
49
+ order = build :order, email: nil, shipping_address: nil, shipping_method: nil
50
+ order.save(validate: false)
51
+
52
+ order = create :order_with_line_items
53
+ order.line_items.first.product.destroy
54
+
55
+ visit admin_path
56
+ click_link 'Orders'
57
+
58
+ assert page.has_css?('h1.ns-page-title', text: 'Orders')
59
+ click_link order.number
60
+ assert page.has_content?('Payment status ABANDONED')
61
+ end
62
+
63
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ class PaymentMethodsAcceptanceTest < ActionDispatch::IntegrationTest
4
+
5
+ test "payment_methods when no payment method is configured" do
6
+ PaymentMethod.delete_all
7
+ visit admin_path
8
+ click_link 'Payment methods'
9
+
10
+ assert page.has_content?("You have not setup any payment method. User wil not be able to make payment")
11
+ end
12
+
13
+ end
@@ -0,0 +1,89 @@
1
+ require "test_helper"
2
+
3
+ class ProductGroupsAcceptanceTest < ActionDispatch::IntegrationTest
4
+
5
+ def handle_js_confirm(accept=true)
6
+ page.execute_script "window.original_confirm_function = window.confirm"
7
+ page.execute_script "window.confirmMsg = null"
8
+ page.execute_script "window.confirm = function(msg) { window.confirmMsg = msg; return #{!!accept}; }"
9
+ yield
10
+ ensure
11
+ page.execute_script "window.confirm = window.original_confirm_function"
12
+ end
13
+
14
+ setup do
15
+ create(:price_group_condition)
16
+ create(:date_group_condition)
17
+ end
18
+
19
+ test "validations" do
20
+ visit admin_product_groups_path
21
+ click_link 'add_new_product_group'
22
+ fill_in 'Product group name', with: ''
23
+ click_button 'Submit'
24
+
25
+ refute page.has_content?('Successfully updated')
26
+ assert page.has_content?("Product group conditions value is invalid")
27
+ assert page.has_content?("Product group conditions value can't be blank")
28
+ assert page.has_content?("Name can't be blank")
29
+ end
30
+
31
+ test "add, edit and delete for product group" do
32
+ Capybara.current_driver = :selenium
33
+ visit admin_product_groups_path
34
+ assert page.has_content?("Product groups")
35
+ click_link 'add_new_product_group'
36
+
37
+ fill_in 'Product group name', with: 'sweet candies'
38
+
39
+ select(find(:xpath, "//*[@id='product_group_product_group_conditions_attributes_0_name']/option[@value='name']").text,
40
+ from: 'product_group_product_group_conditions_attributes_0_name')
41
+
42
+ select(find(:xpath, "//*[@id='product_group_product_group_conditions_attributes_0_operator']/option[@value='contains']").text,
43
+ from: 'product_group_product_group_conditions_attributes_0_operator')
44
+
45
+ fill_in 'product_group_product_group_conditions_attributes_0_value', with: 'candy'
46
+
47
+ click_link 'Add'
48
+
49
+ select(find(:xpath, "//*[@id='product_group_product_group_conditions_attributes_1_name']/option[@value='name']").text,
50
+ from: 'product_group_product_group_conditions_attributes_1_name')
51
+
52
+ select(find(:xpath, "//*[@id='product_group_product_group_conditions_attributes_1_operator']/option[@value='starts']").text,
53
+ from: 'product_group_product_group_conditions_attributes_1_operator')
54
+
55
+ fill_in 'product_group_product_group_conditions_attributes_1_value', with: 'sweet'
56
+
57
+ click_button 'Submit'
58
+
59
+ assert page.has_content?('Successfully updated')
60
+ assert page.has_content?("name contains 'candy' and name starts with 'sweet'")
61
+
62
+ click_link 'Edit'
63
+
64
+ fill_in 'Product group name', with: 'awesome candies'
65
+ fill_in 'product_group_product_group_conditions_attributes_0_value', with: 'awesome'
66
+
67
+ select(find(:xpath, "//*[@id='product_group_product_group_conditions_attributes_0_operator']/option[@value='starts']").text,
68
+ from: 'product_group_product_group_conditions_attributes_0_operator')
69
+
70
+ #page.all(:xpath, "//a[@class='remove-condition']").first.click
71
+ click_link 'Remove'
72
+ click_button 'Submit'
73
+
74
+ assert page.has_content?('Successfully updated')
75
+ assert page.has_content?("name starts with 'awesome'")
76
+
77
+ #https://github.com/thoughtbot/capybara-webkit/issues/109
78
+ handle_js_confirm do
79
+ click_link 'Delete'
80
+ end
81
+
82
+ refute page.has_content?("name starts with 'awesome'")
83
+ end
84
+
85
+ end
86
+
87
+
88
+
89
+