Make test for a "zero hour" block more robust
[rails.git] / app / helpers / banner_helper.rb
index 589df769a2f244403e4e6fcb4e4c9de149e6d46e..4e888173b34ca0e127ff4574239413d9a6b26792 100644 (file)
@@ -1,66 +1,53 @@
 module BannerHelper
-
-  def all_banners()
-    {
-      :sotmus2016 => {
-        :id => 'sotmus2016',
-        :alt => 'State of the Map US 2016',
-        :link => 'http://stateofthemap.us/',
-        :img => 'banners/sotmus-2016.jpg',
-        :enddate => '2016-jul-23'
-      },
-      :sotm2016 => {
-        :id => 'sotm2016',
-        :alt => 'State of the Map 2016',
-        :link => 'http://2016.stateofthemap.org/',
-        :img => 'banners/sotm-2016.jpg',
-        :enddate => '2016-sep-23'
-      }
-    }
-  end
-
-  def active_banners()
-    all_banners().reject do |k,v|
+  def active_banners
+    BANNERS.reject do |_k, v|
       enddate = v[:enddate]
-      parsed = (enddate and Date.parse enddate rescue nil)
-      parsed.is_a?(Date) and parsed.past?
+      begin
+        parsed = enddate && Date.parse(enddate)
+      rescue
+        parsed = nil
+      end
+      !parsed.is_a?(Date) || (parsed.is_a?(Date) && parsed.past?)
     end
   end
 
   # returns the least recently seen banner that is not hidden
-  def next_banner()
-    banners = active_banners()
-    bannerKey = nil
-    cookieKey = nil
-    queuePos = 9999
+  def next_banner
+    banners = active_banners
+    banner_key = nil
+    cookie_key = nil
+    min_index = 9999
+    min_date = Date.new(9999, 1, 1)
 
     banners.each do |k, v|
-      ckey = cookie_id(v[:id]).to_sym
+      ckey = banner_cookie(v[:id]).to_sym
       cval = cookies[ckey] || 0
-      next if cval == 'hide'
+      next if cval == "hide"
 
       # rotate all banner queue positions
       index = cval.to_i
-      if index > 0
-        cookies[ckey] = index - 1
-      end
+      cookies[ckey] = index - 1 if index > 0
 
       # pick banner with mininum queue position
-      if index <= queuePos
-        bannerKey = k
-        cookieKey = ckey
-        queuePos = index
-      end
+      next if index > min_index
+
+      # or if equal queue position, pick banner with soonest end date (i.e. next expiring)
+      end_date = Date.parse(v[:enddate])
+      next if index == min_index && end_date > min_date
+
+      banner_key = k
+      cookie_key = ckey
+      min_index = index
+      min_date = end_date
     end
 
-    unless bannerKey.nil?
-      cookies[cookieKey] = banners.length   # bump to end of queue
-      banners[bannerKey]
+    unless banner_key.nil?
+      cookies[cookie_key] = banners.length # bump to end of queue
+      banners[banner_key]
     end
   end
 
-  def cookie_id(key)
+  def banner_cookie(key)
     "_osm_banner_#{key}"
   end
-
 end