From 95a0bf39f75811c24d6cf781d81e7d2194d014ae Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 15 Aug 2014 15:46:54 +1000 Subject: [PATCH] Enterprise roles must be unique --- app/models/enterprise_role.rb | 3 +++ ...ue_and_fk_constraints_to_enterprise_roles.rb | 8 ++++++++ db/schema.rb | 3 ++- spec/features/admin/enterprise_roles_spec.rb | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20140815053659_add_unique_and_fk_constraints_to_enterprise_roles.rb diff --git a/app/models/enterprise_role.rb b/app/models/enterprise_role.rb index f853e057b6..e3fb116146 100644 --- a/app/models/enterprise_role.rb +++ b/app/models/enterprise_role.rb @@ -2,5 +2,8 @@ class EnterpriseRole < ActiveRecord::Base belongs_to :user, :class_name => Spree.user_class belongs_to :enterprise + validates_presence_of :user_id, :enterprise_id + validates_uniqueness_of :enterprise_id, scope: :user_id, message: "^That role is already present." + scope :by_user_email, joins(:user).order('spree_users.email ASC') end diff --git a/db/migrate/20140815053659_add_unique_and_fk_constraints_to_enterprise_roles.rb b/db/migrate/20140815053659_add_unique_and_fk_constraints_to_enterprise_roles.rb new file mode 100644 index 0000000000..782cad0f20 --- /dev/null +++ b/db/migrate/20140815053659_add_unique_and_fk_constraints_to_enterprise_roles.rb @@ -0,0 +1,8 @@ +class AddUniqueAndFkConstraintsToEnterpriseRoles < ActiveRecord::Migration + def change + add_index :enterprise_roles, [:user_id, :enterprise_id], unique: true + + add_foreign_key :enterprise_roles, :spree_users, column: :user_id + add_foreign_key :enterprise_roles, :enterprises, column: :enterprise_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 84b51e8b93..0ef402ecf5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20140723023713) do +ActiveRecord::Schema.define(:version => 20140815053659) do create_table "adjustment_metadata", :force => true do |t| t.integer "adjustment_id" @@ -222,6 +222,7 @@ ActiveRecord::Schema.define(:version => 20140723023713) do end add_index "enterprise_roles", ["enterprise_id"], :name => "index_enterprise_roles_on_enterprise_id" + add_index "enterprise_roles", ["user_id", "enterprise_id"], :name => "index_enterprise_roles_on_user_id_and_enterprise_id", :unique => true add_index "enterprise_roles", ["user_id"], :name => "index_enterprise_roles_on_user_id" create_table "enterprises", :force => true do |t| diff --git a/spec/features/admin/enterprise_roles_spec.rb b/spec/features/admin/enterprise_roles_spec.rb index f8eb51ff01..c36810e72a 100644 --- a/spec/features/admin/enterprise_roles_spec.rb +++ b/spec/features/admin/enterprise_roles_spec.rb @@ -45,6 +45,23 @@ feature %q{ page.should have_relationship u, e EnterpriseRole.where(user_id: u, enterprise_id: e).should be_present end + + scenario "attempting to create a relationship with invalid data" do + u = create(:user, email: 'u@example.com') + e = create(:enterprise, name: 'One') + create(:enterprise_role, user: u, enterprise: e) + + expect do + # When I attempt to create a duplicate relationship + visit admin_enterprise_roles_path + select 'u@example.com', from: 'enterprise_role_user_id' + select 'One', from: 'enterprise_role_enterprise_id' + click_button 'Create' + + # Then I should see an error message + page.should have_content "That role is already present." + end.to change(EnterpriseRole, :count).by(0) + end end