From d2894a39e5b3a8504cb290a2f41b0aac5fc8b0a8 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 12 Jun 2015 20:39:48 -0400 Subject: [PATCH] Refactor dashboard_choices --- app/helpers/preferences_helper.rb | 29 ++++++++++++++----------- spec/helpers/preferences_helper_spec.rb | 18 ++++++++------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index 6a894186ea6..bceff4fd52e 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -20,22 +20,25 @@ module PreferencesHelper COLOR_SCHEMES.freeze end - # Populates the dashboard preference select field with more user-friendly - # values. + # Maps `dashboard` values to more user-friendly option text + DASHBOARD_CHOICES = { + projects: 'Your Projects (default)', + stars: 'Starred Projects' + }.with_indifferent_access.freeze + + # Returns an Array usable by a select field for more user-friendly option text def dashboard_choices - orig = User.dashboards.keys + defined = User.dashboards - choices = [ - ['Your Projects (default)', orig[0]], - ['Starred Projects', orig[1]] - ] - - if orig.size != choices.size - # Assure that anyone adding new options updates this method too - raise RuntimeError, "`User` defines #{orig.size} dashboard choices," + - " but #{__method__} defined #{choices.size}" + if defined.size != DASHBOARD_CHOICES.size + # Ensure that anyone adding new options updates this method too + raise RuntimeError, "`User` defines #{defined.size} dashboard choices," + + " but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}." else - choices + defined.map do |key, _| + # Use `fetch` so `KeyError` gets raised when a key is missing + [DASHBOARD_CHOICES.fetch(key), key] + end end end diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index 32a9593cc03..920de8c4325 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -32,18 +32,20 @@ describe PreferencesHelper do describe 'dashboard_choices' do it 'raises an exception when defined choices may be missing' do - dashboards = User.dashboards - expect(User).to receive(:dashboards). - and_return(dashboards.merge(foo: 'foo')) + expect(User).to receive(:dashboards).and_return(foo: 'foo') + expect { dashboard_choices }.to raise_error(RuntimeError) + end - expect { dashboard_choices }.to raise_error + it 'raises an exception when defined choices may be using the wrong key' do + expect(User).to receive(:dashboards).and_return(foo: 'foo', bar: 'bar') + expect { dashboard_choices }.to raise_error(KeyError) end it 'provides better option descriptions' do - choices = dashboard_choices - - expect(choices[0]).to eq ['Your Projects (default)', 'projects'] - expect(choices[1]).to eq ['Starred Projects', 'stars'] + expect(dashboard_choices).to match_array [ + ['Your Projects (default)', 'projects'], + ['Starred Projects', 'stars'] + ] end end