From bf3cf4a51e8b533afde331dd04a9626dc3f8606f Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 22 Sep 2016 13:02:03 -0500 Subject: [PATCH] Add HasPrivacy concern --- app/models/character.rb | 10 +--------- app/models/concerns/has_privacy.rb | 16 ++++++++++++++++ app/models/universe.rb | 2 ++ test/models/character_test.rb | 26 ++++++++++++++++++-------- test/models/universe_test.rb | 14 ++++++++++++++ 5 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 app/models/concerns/has_privacy.rb diff --git a/app/models/character.rb b/app/models/character.rb index b3aff2c6..1811034a 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -14,6 +14,7 @@ class Character < ActiveRecord::Base belongs_to :universe + include HasPrivacy include HasContentGroupers # Characters @@ -31,7 +32,6 @@ class Character < ActiveRecord::Base # Items relates :favorite_items, with: :ownerships, where: { favorite: true } - scope :is_public, -> { joins(:universe).where(universes: { privacy: "public" }) } def description role @@ -45,14 +45,6 @@ class Character < ActiveRecord::Base 'group' end - def private? - !public? - end - - def public? - privacy == 'public' - end - def self.attribute_categories { general: { diff --git a/app/models/concerns/has_privacy.rb b/app/models/concerns/has_privacy.rb new file mode 100644 index 00000000..06ed8ad7 --- /dev/null +++ b/app/models/concerns/has_privacy.rb @@ -0,0 +1,16 @@ +require 'active_support/concern' + +module HasPrivacy + extend ActiveSupport::Concern + + included do + def private_content? + !public_content? + end + + def public_content? + in_private_universe = respond_to?(:universe) && universe.present? && universe.private_content? + privacy == 'public' && !in_private_universe + end + end +end diff --git a/app/models/universe.rb b/app/models/universe.rb index d0c446fc..009c6305 100644 --- a/app/models/universe.rb +++ b/app/models/universe.rb @@ -6,6 +6,8 @@ # # contains all canonically-related content created by Users class Universe < ActiveRecord::Base + include HasPrivacy + validates :name, presence: true belongs_to :user diff --git a/test/models/character_test.rb b/test/models/character_test.rb index 53c8659d..bca603e9 100644 --- a/test/models/character_test.rb +++ b/test/models/character_test.rb @@ -9,23 +9,33 @@ class CharacterTest < ActiveSupport::TestCase end test 'character is public when privacy field contains "public"' do - character = build(:character, privacy: 'public') + universe = build(:universe, privacy: 'public') + character = build(:character, privacy: 'public', universe: universe) - assert character.public? - refute character.private? + assert character.public_content? + refute character.private_content? end test 'character is private when privacy field contains "private"' do - character = build(:character, privacy: 'private') + universe = build(:universe, privacy: 'public') + character = build(:character, privacy: 'private', universe: universe) - assert character.private? - refute character.public? + assert character.private_content? + refute character.public_content? end test 'character is private when privacy field is empty' do character = build(:character, privacy: '') - assert character.private? - refute character.public? + assert character.private_content? + refute character.public_content? + end + + test 'character is private when universe is private' do + universe = build(:universe, privacy: 'private') + character = build(:character, privacy: 'public', universe: universe) + + assert character.private_content? + refute character.public_content? end end diff --git a/test/models/universe_test.rb b/test/models/universe_test.rb index 2976b1cb..6da6a731 100644 --- a/test/models/universe_test.rb +++ b/test/models/universe_test.rb @@ -7,4 +7,18 @@ class UniverseTest < ActiveSupport::TestCase refute universe.valid?, 'Universe name is not being validated for presence' end + + test 'universe is private when privacy field contains "private"' do + universe = build(:universe, privacy: 'private') + + assert universe.private_content? + refute universe.public_content? + end + + test 'universe is private when privacy field is empty' do + universe = build(:universe, privacy: '') + + assert universe.private_content? + refute universe.public_content? + end end