diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee index 6040f1d150..e3efa126e1 100644 --- a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, visibleFilter)-> +Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, visibleFilter, Geo)-> new class Enterprises enterprises_by_id: {} constructor: -> @@ -28,3 +28,24 @@ Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, Dereferencer.dereference enterprise.taxons, Taxons.taxons_by_id Dereferencer.dereference enterprise.supplied_taxons, Taxons.taxons_by_id + updateDistance: (query) -> + if query.length > 0 + @calculateDistance(query) + else + @resetDistance() + + calculateDistance: (query) -> + Geo.geocode query, (results, status) => + if status == Geo.OK + console.log "Geocoded #{query} -> #{results[0].geometry.location}." + @setDistanceFrom results[0].geometry.location + else + console.log "Geocoding failed for the following reason: #{status}" + @resetDistance() + + setDistanceFrom: (location) -> + for enterprise in @enterprises + enterprise.distance = Geo.distanceBetween enterprise, location + + resetDistance: -> + enterprise.distance = null for enterprise in @enterprises diff --git a/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee index 94dd7d39d2..3a7368f107 100644 --- a/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee @@ -1,6 +1,18 @@ describe "Enterprises service", -> Enterprises = null CurrentHubMock = {} + Geo = + OK: 'ok' + succeed: true + geocode: (query, callback) -> + if @succeed + results = [{geometry: {location: "location"}}] + callback(results, @OK) + else + callback(results, 'Oops') + distanceBetween: (locatable, location) -> + 123 + taxons = [ {id: 1, name: "test"} ] @@ -19,6 +31,7 @@ describe "Enterprises service", -> module 'Darkswarm' module ($provide)-> $provide.value "CurrentHub", CurrentHubMock + $provide.value "Geo", Geo null angular.module('Darkswarm').value('enterprises', enterprises) angular.module('Darkswarm').value('taxons', taxons) @@ -73,3 +86,45 @@ describe "Enterprises service", -> expect(Enterprises.producers).toContain Enterprises.enterprises[4] expect(Enterprises.producers).toContain Enterprises.enterprises[5] expect(Enterprises.producers).toContain Enterprises.enterprises[6] + + describe "updating distance of enterprises from a location", -> + it "calculates the distance when a query is provided", -> + spyOn(Enterprises, "calculateDistance") + Enterprises.updateDistance "asdf" + expect(Enterprises.calculateDistance).toHaveBeenCalledWith("asdf") + + it "resets the distance when query is blank", -> + spyOn(Enterprises, "resetDistance") + Enterprises.updateDistance "" + expect(Enterprises.resetDistance).toHaveBeenCalled() + + describe "calculating the distance of enterprises from a location", -> + beforeEach -> + spyOn(Enterprises, "setDistanceFrom") + + it "calculates distance for all enterprises when geocoding succeeds", -> + Geo.succeed = true + Enterprises.calculateDistance('query') + expect(Enterprises.setDistanceFrom).toHaveBeenCalledWith("location") + + it "resets distance when geocoding fails", -> + Geo.succeed = false + spyOn(Enterprises, "resetDistance") + Enterprises.calculateDistance('query') + expect(Enterprises.setDistanceFrom).not.toHaveBeenCalled() + expect(Enterprises.resetDistance).toHaveBeenCalled() + + describe "setting the distance of each enterprise from a central location", -> + it "sets the distances", -> + Enterprises.setDistanceFrom 'location' + for e in Enterprises.enterprises + expect(e.distance).toEqual 123 + + describe "resetting the distance measurement of all enterprises", -> + beforeEach -> + e.distance = 123 for e in Enterprises.enterprises + + it "resets the distance", -> + Enterprises.resetDistance() + for e in Enterprises.enterprises + expect(e.distance).toBeNull() \ No newline at end of file diff --git a/spec/javascripts/unit/darkswarm/services/groups_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/groups_spec.js.coffee index abd9c5c617..50e2159338 100644 --- a/spec/javascripts/unit/darkswarm/services/groups_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/groups_spec.js.coffee @@ -1,7 +1,8 @@ describe "Groups service", -> Groups = null Enterprises = null - CurrentHubMock = {} + CurrentHubMock = {} + Geo = {} groups = [{ id: 1 name: "Test Group" @@ -17,17 +18,18 @@ describe "Groups service", -> beforeEach -> module 'Darkswarm' - angular.module('Darkswarm').value('groups', groups) - angular.module('Darkswarm').value('enterprises', enterprises) + angular.module('Darkswarm').value('groups', groups) + angular.module('Darkswarm').value('enterprises', enterprises) module ($provide)-> - $provide.value "CurrentHub", CurrentHubMock + $provide.value "CurrentHub", CurrentHubMock + $provide.value "Geo", Geo null inject (_Groups_, _Enterprises_)-> - Groups = _Groups_ - Enterprises = _Enterprises_ + Groups = _Groups_ + Enterprises = _Enterprises_ it "dereferences group enterprises", -> expect(Groups.groups[0].enterprises[0]).toBe enterprises[0] - + it "dereferences enterprise groups", -> expect(Enterprises.enterprises[0].groups[0]).toBe groups[0] diff --git a/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee index 3ef21705d3..4252000460 100644 --- a/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee @@ -1,6 +1,7 @@ describe "Hubs service", -> OfnMap = null - CurrentHubMock = {} + CurrentHubMock = {} + Geo = {} enterprises = [ { id: 2 @@ -13,12 +14,13 @@ describe "Hubs service", -> beforeEach -> module 'Darkswarm' - angular.module('Darkswarm').value('enterprises', enterprises) + angular.module('Darkswarm').value('enterprises', enterprises) module ($provide)-> - $provide.value "CurrentHub", CurrentHubMock + $provide.value "CurrentHub", CurrentHubMock + $provide.value "Geo", Geo null inject ($injector)-> - OfnMap = $injector.get("OfnMap") + OfnMap = $injector.get("OfnMap") it "builds MapMarkers from enterprises", -> expect(OfnMap.enterprises[0].id).toBe enterprises[0].id diff --git a/spec/javascripts/unit/darkswarm/services/products_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/products_spec.js.coffee index 590156260d..778e701c7d 100644 --- a/spec/javascripts/unit/darkswarm/services/products_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/products_spec.js.coffee @@ -10,6 +10,7 @@ describe 'Products service', -> productWithImage = null properties = null taxons = null + Geo = {} beforeEach -> product = @@ -40,6 +41,7 @@ describe 'Products service', -> $provide.value "currentOrder", currentOrder $provide.value "taxons", taxons $provide.value "properties", properties + $provide.value "Geo", Geo null inject ($injector, _$httpBackend_)->