aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/public_body_category.rb13
-rw-r--r--app/models/public_body_category_link.rb19
-rw-r--r--app/models/public_body_heading.rb16
-rw-r--r--spec/models/public_body_category_link_spec.rb28
-rw-r--r--spec/models/public_body_category_spec.rb6
-rw-r--r--spec/models/public_body_heading_spec.rb54
6 files changed, 108 insertions, 28 deletions
diff --git a/app/models/public_body_category.rb b/app/models/public_body_category.rb
index 0c5142cfd..e78b91733 100644
--- a/app/models/public_body_category.rb
+++ b/app/models/public_body_category.rb
@@ -118,22 +118,9 @@ class PublicBodyCategory < ActiveRecord::Base
# we already have this, stop
return
end
-
- # find the last display_order for this heading
- last_link = PublicBodyCategoryLink.where(
- :public_body_heading_id => heading.id
- ).order(:category_display_order).last
-
- if last_link
- display_order = last_link.category_display_order + 1
- else
- display_order = 1
- end
-
heading_link = PublicBodyCategoryLink.create(
:public_body_category_id => self.id,
:public_body_heading_id => heading.id,
- :category_display_order => display_order
)
end
diff --git a/app/models/public_body_category_link.rb b/app/models/public_body_category_link.rb
index bd4fe541a..e5a0d7f25 100644
--- a/app/models/public_body_category_link.rb
+++ b/app/models/public_body_category_link.rb
@@ -12,4 +12,21 @@ class PublicBodyCategoryLink < ActiveRecord::Base
belongs_to :public_body_category
belongs_to :public_body_heading
-end \ No newline at end of file
+ validates :category_display_order, :numericality => { :only_integer => true,
+ :message => N_('Display order must be a number') }
+
+ before_validation :on => :create do
+ unless self.category_display_order
+ self.category_display_order = PublicBodyCategoryLink.next_display_order(self.public_body_heading_id)
+ end
+ end
+
+ def PublicBodyCategoryLink.next_display_order(heading_id)
+ if last = where(:public_body_heading_id => heading_id).order(:category_display_order).last
+ last.category_display_order + 1
+ else
+ 0
+ end
+ end
+
+end
diff --git a/app/models/public_body_heading.rb b/app/models/public_body_heading.rb
index 62e7d8e91..e675162f8 100644
--- a/app/models/public_body_heading.rb
+++ b/app/models/public_body_heading.rb
@@ -18,6 +18,14 @@ class PublicBodyHeading < ActiveRecord::Base
validates_uniqueness_of :name, :message => N_('Name is already taken')
validates_presence_of :name, :message => N_('Name can\'t be blank')
+ validates :display_order, :numericality => { :only_integer => true,
+ :message => N_('Display order must be a number') }
+
+ before_validation :on => :create do
+ unless self.display_order
+ self.display_order = PublicBodyHeading.next_display_order
+ end
+ end
# Convenience methods for creating/editing translations via forms
def find_translation_by_locale(locale)
@@ -49,4 +57,12 @@ class PublicBodyHeading < ActiveRecord::Base
end
end
end
+
+ def PublicBodyHeading.next_display_order
+ if max = maximum(:display_order)
+ max + 1
+ else
+ 0
+ end
+ end
end
diff --git a/spec/models/public_body_category_link_spec.rb b/spec/models/public_body_category_link_spec.rb
index 9fce062a3..105f97864 100644
--- a/spec/models/public_body_category_link_spec.rb
+++ b/spec/models/public_body_category_link_spec.rb
@@ -9,5 +9,29 @@
require 'spec_helper'
-describe PublicBodyCategoryLink do
-end \ No newline at end of file
+describe PublicBodyHeading, 'when validating' do
+
+ it 'should set a default display order based on the next available display order' do
+ heading_with_no_categories = FactoryGirl.create(:heading_with_no_categories)
+ lonely_category = FactoryGirl.create(:lonely_category)
+ category_link = PublicBodyCategoryLink.new(:heading => heading_with_no_categories,
+ :category_link => lonely_category)
+ category_link.valid?
+ category_link.category_display_order.should == PublicBodyCategoryLink.next_display_order(heading_with_no_categories)
+ end
+
+end
+
+describe PublicBodyCategoryLink, 'when setting a category display order' do
+
+ it 'should return 0 if there are no public body headings' do
+ heading_with_no_categories = FactoryGirl.create(:heading_with_no_categories)
+ PublicBodyCategoryLink.next_display_order(heading_with_no_categories).should == 0
+ end
+
+ it 'should return one more than the highest display order if there are public body headings' do
+ silly_heading = FactoryGirl.create(:silly_heading)
+ PublicBodyCategoryLink.next_display_order(silly_heading).should == 2
+ end
+
+end
diff --git a/spec/models/public_body_category_spec.rb b/spec/models/public_body_category_spec.rb
index d892c8bda..d3c91e4f8 100644
--- a/spec/models/public_body_category_spec.rb
+++ b/spec/models/public_body_category_spec.rb
@@ -33,13 +33,13 @@ describe PublicBodyCategory do
cat_group2[0].public_body_category_links.where(
:public_body_heading_id => headings[1].id).
first.
- category_display_order.should eq 1
+ category_display_order.should eq 0
cat_group2[1].title.should eq "Aardvark"
cat_group2[1].public_body_category_links.where(
:public_body_heading_id => headings[1].id).
first.
- category_display_order.should eq 2
+ category_display_order.should eq 1
end
end
@@ -116,4 +116,4 @@ describe PublicBodyCategory do
end
end
end
-end \ No newline at end of file
+end
diff --git a/spec/models/public_body_heading_spec.rb b/spec/models/public_body_heading_spec.rb
index ec5c3ad2c..3ca01c648 100644
--- a/spec/models/public_body_heading_spec.rb
+++ b/spec/models/public_body_heading_spec.rb
@@ -10,18 +10,54 @@
require 'spec_helper'
-describe PublicBodyHeading do
+describe PublicBodyHeading, 'when loading the data' do
+
before do
load_test_categories
end
- describe 'when loading the data' do
- it 'should use the display_order field to preserve the original data order' do
- headings = PublicBodyHeading.all
- headings[0].name.should eq 'Local and regional'
- headings[0].display_order.should eq 1
- headings[1].name.should eq 'Miscellaneous'
- headings[1].display_order.should eq 2
- end
+ it 'should use the display_order field to preserve the original data order' do
+ headings = PublicBodyHeading.all
+ headings[0].name.should eq 'Local and regional'
+ headings[0].display_order.should eq 1
+ headings[1].name.should eq 'Miscellaneous'
+ headings[1].display_order.should eq 2
+ end
+
+end
+
+describe PublicBodyHeading, 'when validating' do
+
+ it 'should require a name' do
+ heading = PublicBodyHeading.new
+ heading.should_not be_valid
+ heading.errors[:name].should == ["Name can't be blank"]
+ end
+
+ it 'should require a unique name' do
+ heading = FactoryGirl.create(:silly_heading)
+ new_heading = PublicBodyHeading.new(:name => heading.name)
+ new_heading.should_not be_valid
+ new_heading.errors[:name].should == ["Name is already taken"]
+ end
+
+ it 'should set a default display order based on the next available display order' do
+ heading = PublicBodyHeading.new
+ heading.valid?
+ heading.display_order.should == PublicBodyHeading.next_display_order
end
+
+end
+
+describe PublicBodyHeading, 'when setting a display order' do
+
+ it 'should return 0 if there are no public body headings' do
+ PublicBodyHeading.next_display_order.should == 0
+ end
+
+ it 'should return one more than the highest display order if there are public body headings' do
+ heading = FactoryGirl.create(:popular_heading)
+ PublicBodyHeading.next_display_order.should == 2
+ end
+
end