Commit 7cff7d6f authored by Robert Speicher's avatar Robert Speicher

Refactor dashboard_choices

cherry-picked
parent 17af09b1
# Helper methods for per-User preferences # Helper methods for per-User preferences
module PreferencesHelper module PreferencesHelper
# Populates the dashboard preference select field with more user-friendly # Maps `dashboard` values to more user-friendly option text
# values. DASHBOARD_CHOICES = {
def dashboard_choices projects: 'Your Projects (default)',
orig = User.dashboards.keys stars: 'Starred Projects'
}.with_indifferent_access.freeze
choices = [ # Returns an Array usable by a select field for more user-friendly option text
['Your Projects (default)', orig[0]], def dashboard_choices
['Starred Projects', orig[1]] defined = User.dashboards
]
if orig.size != choices.size if defined.size != DASHBOARD_CHOICES.size
# Assure that anyone adding new options updates this method too # Ensure that anyone adding new options updates this method too
raise RuntimeError, "`User` defines #{orig.size} dashboard choices," + raise RuntimeError, "`User` defines #{defined.size} dashboard choices," +
" but #{__method__} defined #{choices.size}" " but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}."
else 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
end end
end end
...@@ -3,18 +3,20 @@ require 'spec_helper' ...@@ -3,18 +3,20 @@ require 'spec_helper'
describe PreferencesHelper do describe PreferencesHelper do
describe 'dashboard_choices' do describe 'dashboard_choices' do
it 'raises an exception when defined choices may be missing' do it 'raises an exception when defined choices may be missing' do
dashboards = User.dashboards expect(User).to receive(:dashboards).and_return(foo: 'foo')
expect(User).to receive(:dashboards). expect { dashboard_choices }.to raise_error(RuntimeError)
and_return(dashboards.merge(foo: 'foo')) 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 end
it 'provides better option descriptions' do it 'provides better option descriptions' do
choices = dashboard_choices expect(dashboard_choices).to match_array [
['Your Projects (default)', 'projects'],
expect(choices[0]).to eq ['Your Projects (default)', 'projects'] ['Starred Projects', 'stars']
expect(choices[1]).to eq ['Starred Projects', 'stars'] ]
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment