From c8384f1a71b2541467675bec4e5b64e2249f2e22 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 13:05:44 +1000 Subject: [PATCH] Reworking the RABL templates for simplicity AND fixing up all the tests --- .../{hub.js.coffee => current_hub.js.coffee} | 0 .../darkswarm/services/enterprises.js.coffee | 5 ++ .../darkswarm/services/hubs.js.coffee | 2 +- .../darkswarm/services/producers.js.coffee | 7 -- app/views/json/_enterprises.rabl | 21 ++---- app/views/json/_hubs.rabl | 26 +------ app/views/json/_producers.rabl | 22 +----- .../_enterprise.rabl} | 28 ++++---- app/views/json/partials/_hub.rabl | 21 ++++++ app/views/json/partials/_producer.rabl | 9 +++ app/views/layouts/darkswarm.html.haml | 1 + spec/javascripts/application_spec.js | 3 + spec/javascripts/mock_google_maps.js.coffee | 68 +++++++++++++++++++ .../accordion_controller_spec.js.coffee | 5 ++ .../darkswarm/services/order_spec.js.coffee | 15 +++- 15 files changed, 146 insertions(+), 87 deletions(-) rename app/assets/javascripts/darkswarm/services/{hub.js.coffee => current_hub.js.coffee} (100%) create mode 100644 app/assets/javascripts/darkswarm/services/enterprises.js.coffee rename app/views/json/{_enterprises_for_map.rabl => partials/_enterprise.rabl} (51%) create mode 100644 app/views/json/partials/_hub.rabl create mode 100644 app/views/json/partials/_producer.rabl create mode 100644 spec/javascripts/mock_google_maps.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/hub.js.coffee b/app/assets/javascripts/darkswarm/services/current_hub.js.coffee similarity index 100% rename from app/assets/javascripts/darkswarm/services/hub.js.coffee rename to app/assets/javascripts/darkswarm/services/current_hub.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee new file mode 100644 index 0000000000..b967bdd18c --- /dev/null +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -0,0 +1,5 @@ +Darkswarm.factory 'Enterprises', (enterprises)-> + new class Enterprises + constructor: -> + @enterprises = enterprises + @dereference() diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index a3f2b03f23..275ce45cec 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Hubs', ($location, hubs, $filter, CurrentHub) -> +Darkswarm.factory 'Hubs', (hubs, $filter) -> new class Hubs constructor: -> @hubs = $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 6c393660de..65e33599af 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -2,11 +2,4 @@ Darkswarm.factory 'Producers', (producers) -> new class Producers constructor: -> @producers = producers - - # TODO: start adding functionality to producers like so - #@producers = (@extend(producer) for producer in producers) - #extend: (producer)-> - #new class Producer - #constructor: -> - #@[k] = v for k, v of Producer diff --git a/app/views/json/_enterprises.rabl b/app/views/json/_enterprises.rabl index 733bf79e19..40065ff03f 100644 --- a/app/views/json/_enterprises.rabl +++ b/app/views/json/_enterprises.rabl @@ -1,18 +1,5 @@ -# DON'T USE DIRECTLY - for inheritance +collection Enterprise.visible attributes :name, :id, :description - -node :email do |enterprise| - enterprise.email.to_s.reverse -end - -child :address do - extends "json/partials/address" -end - -node :path do |enterprise| - shop_enterprise_path(enterprise) -end - -node :hash do |enterprise| - enterprise.to_param -end +extends 'json/partials/enterprise' +extends 'json/partials/producer' +extends 'json/partials/hub' diff --git a/app/views/json/_hubs.rabl b/app/views/json/_hubs.rabl index c118b4504f..8e8e36d213 100644 --- a/app/views/json/_hubs.rabl +++ b/app/views/json/_hubs.rabl @@ -1,26 +1,4 @@ collection Enterprise.visible.is_distributor -extends 'json/enterprises' +extends 'json/partials/enterprise' +extends 'json/partials/hub' -child distributed_taxons: :taxons do - extends "json/taxon" -end - -child suppliers: :producers do - extends "json/producer" -end - -node :pickup do |hub| - not hub.shipping_methods.where(:require_ship_address => false).empty? -end - -node :delivery do |hub| - not hub.shipping_methods.where(:require_ship_address => true).empty? -end - -node :active do |hub| - @active_distributors.include?(hub) -end - -node :orders_close_at do |hub| - OrderCycle.first_closing_for(hub).andand.orders_close_at -end diff --git a/app/views/json/_producers.rabl b/app/views/json/_producers.rabl index 95a133a182..89839c51ea 100644 --- a/app/views/json/_producers.rabl +++ b/app/views/json/_producers.rabl @@ -1,21 +1,3 @@ collection @producers -extends 'json/enterprises' - -child supplied_taxons: :taxons do - extends 'json/taxon' -end - -child distributors: :distributors do - attributes :name, :id - node :path do |distributor| - shop_enterprise_path(distributor) - end -end - -node :path do |producer| - producer_path(producer) -end - -node :hash do |producer| - producer.to_param -end +extends 'json/partials/enterprise' +extends 'json/partials/producer' diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/partials/_enterprise.rabl similarity index 51% rename from app/views/json/_enterprises_for_map.rabl rename to app/views/json/partials/_enterprise.rabl index a2c6eb06ac..4ebf5f7a78 100644 --- a/app/views/json/_enterprises_for_map.rabl +++ b/app/views/json/partials/_enterprise.rabl @@ -1,6 +1,16 @@ -collection @enterprises -extends 'json/enterprises' -attributes :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? +attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? + +node :email do |enterprise| + enterprise.email.to_s.reverse +end + +child :address do + extends "json/partials/address" +end + +node :hash do |enterprise| + enterprise.to_param +end node :logo do |enterprise| enterprise.logo(:medium) if enterprise.logo.exists? @@ -10,18 +20,6 @@ node :promo_image do |enterprise| enterprise.promo_image(:large) if enterprise.promo_image.exists? end -node :active do |enterprise| - @active_distributors.include?(enterprise) -end - -child distributors: :hubs do - extends 'json/enterprises' - node :active do |hub| - @active_distributors.include?(hub) - end -end - - node :icon do |e| if e.is_primary_producer? and e.is_distributor? image_path "map-icon-both.svg" diff --git a/app/views/json/partials/_hub.rabl b/app/views/json/partials/_hub.rabl new file mode 100644 index 0000000000..c1f7879268 --- /dev/null +++ b/app/views/json/partials/_hub.rabl @@ -0,0 +1,21 @@ +child distributed_taxons: :taxons do + extends "json/taxon" +end +child suppliers: :producers do + attributes :id +end +node :path do |enterprise| + shop_enterprise_path(enterprise) +end +node :pickup do |hub| + not hub.shipping_methods.where(:require_ship_address => false).empty? +end +node :delivery do |hub| + not hub.shipping_methods.where(:require_ship_address => true).empty? +end +node :active do |hub| + @active_distributors.include?(hub) +end +node :orders_close_at do |hub| + OrderCycle.first_closing_for(hub).andand.orders_close_at +end diff --git a/app/views/json/partials/_producer.rabl b/app/views/json/partials/_producer.rabl new file mode 100644 index 0000000000..a3f7975b40 --- /dev/null +++ b/app/views/json/partials/_producer.rabl @@ -0,0 +1,9 @@ +child supplied_taxons: :taxons do + extends 'json/taxon' +end +child distributors: :hubs do + attributes :id +end +node :path do |producer| + producer_path(producer) +end diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index 5208c3d5ef..f399756efc 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -26,6 +26,7 @@ = inject_json "currentHub", "current_hub" + = inject_json "enterprises", "enterprises" = inject_json "currentOrder", "current_order" = inject_json "user", "current_user" = inject_json "railsFlash", "flash" diff --git a/spec/javascripts/application_spec.js b/spec/javascripts/application_spec.js index df629c1c81..4eacb45036 100644 --- a/spec/javascripts/application_spec.js +++ b/spec/javascripts/application_spec.js @@ -5,7 +5,10 @@ //= require angular-mocks //= require angular-cookies //= require angular-backstretch.js +//= require lodash.underscore.js //= require angular-flash.min.js //= require moment angular.module('templates', []) +angular.module('google-maps', []); +angular.module('duScroll', []); diff --git a/spec/javascripts/mock_google_maps.js.coffee b/spec/javascripts/mock_google_maps.js.coffee new file mode 100644 index 0000000000..02ef0aa81f --- /dev/null +++ b/spec/javascripts/mock_google_maps.js.coffee @@ -0,0 +1,68 @@ +@google = + maps: + event: + addDomListener: -> + addDomListenerOnce: -> + addListener: -> + addListenerOnce: -> + bind: -> + clearInstanceListeners: -> + clearListeners: -> + forward: -> + removeListener: -> + trigger: -> + vf: -> + +class google.maps.LatLng + constructor: (lat, lng) -> + @latitude = parseFloat(lat) + @longitude = parseFloat(lng) + + lat: -> @latitude + lng: -> @longitude + +class google.maps.LatLngBounds + constructor: (@ne, @sw) -> + + getSouthWest: -> @sw + getNorthEast: -> @ne + +class google.maps.OverlayView + +class google.maps.Marker + getAnimation: -> + getClickable: -> + getCursor: -> + getDraggable: -> + getFlat: -> + getIcon: -> + getPosition: -> + getShadow: -> + getShape: -> + getTitle: -> + getVisible: -> + getZIndex: -> + setAnimation: -> + setClickable: -> + setCursor: -> + setDraggable: -> + setFlat: -> + setIcon: -> + setPosition: -> + setShadow: -> + setShape: -> + setTitle: -> + setVisible: -> + setZIndex: -> + setMap: -> + getMap: -> + +class google.maps.MarkerImage + +class google.maps.Map + +class google.maps.Point + +class google.maps.Size + +class google.maps.InfoWindow diff --git a/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee b/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee index 8e59248806..9c2545b851 100644 --- a/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee @@ -1,9 +1,14 @@ describe "AccordionCtrl", -> ctrl = null scope = null + CurrentHubMock = + id: 1 beforeEach -> module "Darkswarm" + module ($provide)-> + $provide.value "CurrentHub", CurrentHubMock + null localStorage.clear() describe "loading incomplete form", -> diff --git a/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee index f6a4112eef..58b2838ac4 100644 --- a/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee @@ -6,6 +6,10 @@ describe 'Order service', -> flash = null storage = null scope = null + CurrentHubMock = + id: 1 + FlashLoaderMock = + loadFlash: (arg)-> beforeEach -> orderData = @@ -36,6 +40,10 @@ describe 'Order service', -> angular.module('Darkswarm').value('order', orderData) module 'Darkswarm' + module ($provide)-> + $provide.value "CurrentHub", CurrentHubMock + $provide.value "RailsFlashLoader", FlashLoaderMock + null inject ($injector, _$httpBackend_, _storage_, $rootScope)-> $httpBackend = _$httpBackend_ @@ -58,13 +66,13 @@ describe 'Order service', -> spyOn(storage, "bind") Order.fieldsToBind = ["testy"] Order.bindFieldsToLocalStorage({}) - prefix = "order_#{Order.order.id}#{Order.order.user_id}" + prefix = "order_#{Order.order.id}#{Order.order.user_id}#{CurrentHubMock.id}" expect(storage.bind).toHaveBeenCalledWith({}, "Order.order.testy", {storeName: "#{prefix}_testy"}) expect(storage.bind).toHaveBeenCalledWith({}, "Order.ship_address_same_as_billing", {storeName: "#{prefix}_sameasbilling", defaultValue: true}) it "binds order to local storage", -> Order.bindFieldsToLocalStorage(scope) - prefix = "order_#{Order.order.id}#{Order.order.user_id}" + prefix = "order_#{Order.order.id}#{Order.order.user_id}#{CurrentHubMock.id}" expect(localStorage.getItem("#{prefix}_email")).toMatch "test@test.com" it "does not store secrets in local storage", -> @@ -100,10 +108,11 @@ describe 'Order service', -> $httpBackend.flush() it "sends flash messages to the flash service", -> + spyOn(FlashLoaderMock, "loadFlash") # Stubbing out writes to window.location $httpBackend.expectPUT("/checkout").respond 400, {flash: {error: "frogs"}} Order.submit() $httpBackend.flush() - expect(flash.error).toEqual "frogs" + expect(FlashLoaderMock.loadFlash).toHaveBeenCalledWith {error: "frogs"} it "puts errors into the scope", -> $httpBackend.expectPUT("/checkout").respond 400, {errors: {error: "frogs"}}