/test/unit/role_test.rb

https://github.com/bennett/xlsuite · Ruby · 295 lines · 238 code · 55 blank · 2 comment · 3 complexity · 64e904c9e99366cdbbf11a933fb0d148 MD5 · raw file

  1. require File.dirname(__FILE__) + '/../test_helper'
  2. class RoleTest < Test::Unit::TestCase
  3. setup do
  4. @account = accounts(:wpul)
  5. end
  6. context "A new role object with name 'def'" do
  7. setup do
  8. @ps = @account.roles.build(:name => "def")
  9. end
  10. should "not be saved even if permission_ids is specified before create" do
  11. @permids = Permission.find(:all, :limit => 2).map(&:id)
  12. @ps.permission_ids = @permids
  13. assert @ps.new_record?, "Should not save because we assigned permission ids"
  14. @ps.save!
  15. assert_equal @permids.sort, @ps.reload.permission_ids.sort
  16. end
  17. should "not be saved even when children_ids is specified before create" do
  18. @role = @account.roles.create!(:name => "abc")
  19. @ps.children_ids = [@role.id]
  20. assert @ps.new_record?, "Should not save because we assigned children ids"
  21. @ps.save!
  22. assert_equal [@role.id], @ps.reload.children_ids
  23. end
  24. end
  25. context "Performing permission_ids= assignment on an existing role with name 'abc'" do
  26. setup do
  27. @role = @account.roles.create!(:name => "abc")
  28. @permissions = Permission.find(:all).map(&:id).map(&:to_s)
  29. assert_nothing_raised do
  30. @role.permission_ids = @permissions
  31. end
  32. @role.save!
  33. end
  34. should "assign the permissions correctly" do
  35. assert_equal @permissions.size, @role.permissions(true).size
  36. end
  37. should "remove old permissions" do
  38. p = Permission.find_by_name("edit_candidate")
  39. @role.permission_ids = [p.id]
  40. @role.save!
  41. assert_equal %w(edit_candidate), @role.permissions(true).map(&:name)
  42. end
  43. end
  44. context "Calling #children_ids on an existing role named 'abc'" do
  45. setup do
  46. @role = @account.roles.create!(:name => "abc")
  47. @role0 = @account.roles.create!(:name => "role0")
  48. @role1 = @account.roles.create!(:name => "role1")
  49. @role.children_ids = [@role0.id, @role1.id]
  50. @role.save!
  51. @role.reload
  52. end
  53. should "assign the child roles correctly" do
  54. assert_equal 2, @role.children.size
  55. assert_equal [@role0, @role1].map(&:name).sort,
  56. @role.children.map(&:name).sort
  57. assert_equal @role, @role0.reload.parent
  58. assert_equal @role, @role1.reload.parent
  59. end
  60. should "remove old children" do
  61. @role.children_ids = [@role1.id]
  62. @role.save!
  63. @role.reload
  64. assert_equal 1, @role.children.size
  65. assert_equal [@role1].map(&:name).sort,
  66. @role.children.map(&:name).sort
  67. end
  68. end
  69. context "An existing role with name 'abc'" do
  70. setup do
  71. @role = @account.roles.create!(:name => "abc")
  72. end
  73. should "be able to have permissions appended without raising any exception" do
  74. assert_nothing_raised do
  75. @role.append_permissions(:edit_link)
  76. end
  77. end
  78. should "be able to have children roles" do
  79. @child = @role.children.create!(:name => "def")
  80. assert_equal @role, @child.reload.parent
  81. assert_equal [@child], @role.children(true)
  82. end
  83. should "has its children permissions" do
  84. @role0 = @account.roles.create!(:name => "role0")
  85. @role0.permissions << Permission.find_or_create_by_name("aria")
  86. @role.children << @role0
  87. assert @role.reload.effective_permissions.map(&:name).include?("aria"),
  88. @role.reload.effective_permissions.map(&:name).inspect + " should have included 'aria'"
  89. end
  90. should "has its grandchildren permissions" do
  91. @role0 = @account.roles.create!(:name => "role0")
  92. @role1 = @account.roles.create!(:name => "role1")
  93. @role1.permissions << Permission.find_or_create_by_name("aria")
  94. @role1.save!
  95. @role0.children << @role1
  96. @role0.save!
  97. @role.children << @role0
  98. @role.save!
  99. assert_include "aria", @role.effective_permissions.map(&:name)
  100. end
  101. end
  102. context "A child role" do
  103. setup do
  104. @role0 = @account.roles.create!(:name => "role0")
  105. @role1 = @account.roles.create!(:name => "role1")
  106. @role0.children_ids = [@role1.id.to_s]
  107. assert @role0.save
  108. assert_equal [@role1], @role0.reload.children
  109. end
  110. should "not be able to assign its parent as one of his children" do
  111. @role1.reload.children_ids = [@role0.id.to_s]
  112. assert !@role1.save
  113. assert_equal [], @role1.reload.children
  114. end
  115. end
  116. context "A role with children" do
  117. setup do
  118. @root = @account.roles.create!(:name => "root")
  119. @child0 = @root.children.create!(:name => "root/child0")
  120. @child1 = @root.children.create!(:name => "root/child1")
  121. end
  122. def test_can_return_roots_only
  123. assert_equal [@root], @account.roles.find_all_roots
  124. end
  125. end
  126. context "A role" do
  127. setup do
  128. # TODO: why do I have to keep doing this?
  129. @role = @account.roles.find_by_name("abc")
  130. @role.destroy if @role
  131. end
  132. def test_have_permissions
  133. assert_nothing_raised { Role.new.permissions }
  134. end
  135. def test_requires_name
  136. @role = Role.new
  137. assert !@role.valid?
  138. assert /can't be blank/i, @role.errors.on(:name) #' for TextMate/Vim
  139. end
  140. def test_remembers_creator
  141. @role = @account.roles.build(:name => "abc", :created_by => (party = @account.parties.create!))
  142. @role.save!
  143. assert_equal party, @role.reload.created_by
  144. end
  145. def test_remembers_updator
  146. @role = @account.roles.build(:name => "abc", :updated_by => (party = @account.parties.create!))
  147. @role.save!
  148. assert_equal party, @role.reload.updated_by
  149. end
  150. end
  151. context "Another role" do
  152. setup do
  153. # ALWAYS CROSS CHECK THIS DEFAULT PERMISSIONS WITH DEFAULT PERMISSIONS IN Party#set_effective_permissions
  154. @default_permissions = [Permission.find_by_name("edit_own_account"), Permission.find_by_name("edit_own_contacts_only")].compact
  155. end
  156. context "Permissions appended to a parent role" do
  157. setup do
  158. @parent = @account.roles.build(:name => "parent")
  159. @parent.save!
  160. @permissions = Permission.find(:all, :limit => 3)
  161. @parent.permissions << @permissions
  162. assert_equal @permissions.map(&:id).sort, @parent.total_granted_permissions.map(&:id).sort
  163. end
  164. should "not propagate to its children and grandchildren" do
  165. @child1 = @account.roles.build(:name => "child1")
  166. @child1.parent = @parent
  167. assert @child1.save
  168. assert_equal 0, @child1.total_granted_permissions.size
  169. @grandchild1 = @account.roles.build(:name => "grandchild1")
  170. @grandchild1.parent = @child1
  171. assert @grandchild1.save
  172. assert_equal 0, @grandchild1.total_granted_permissions.size
  173. end
  174. end
  175. end
  176. context "A hierarchy of roles (admins => accountants => helpers)" do
  177. setup do
  178. @admin_role = @account.roles.create!(:name => "admins")
  179. @accountants_role = @account.roles.create!(:name => "accountants", :parent => @admin_role)
  180. @helpers_role = @account.roles.create!(:name => "helpers", :parent => @accountants_role)
  181. @admin_role.parties << parties(:peter)
  182. @admin_role.permissions << Permission.find_or_create_by_name("edit_party_security")
  183. @accountants_role.parties << parties(:mary)
  184. @accountants_role.permissions << Permission.find_or_create_by_name("edit_invoices")
  185. @helpers_role.permissions << Permission.find_or_create_by_name("view_invoices")
  186. @helpers_role.parties << parties(:john)
  187. [@admin_role, @accountants_role, @helpers_role].each(&:reload)
  188. end
  189. should "make helpers the sole child of accountants" do
  190. assert_equal [@helpers_role].map(&:to_s), @accountants_role.children.map(&:to_s)
  191. end
  192. should "make accountants the parent of helpers" do
  193. assert_equal @accountants_role.to_s, @helpers_role.parent.to_s
  194. end
  195. should "make the direct parties part of the role (John has role Helper)" do
  196. assert_include parties(:john).to_s, @helpers_role.total_parties.map(&:to_s)
  197. end
  198. should "make the direct ancestor party's part of a child role (Mary should be part of Helpers)" do
  199. assert_include parties(:mary).to_s, @helpers_role.total_parties.map(&:to_s)
  200. end
  201. should "make the full ancestor party's part of a child role (Peter should be part of Helpers)" do
  202. assert_include parties(:peter).to_s, @helpers_role.total_parties.map(&:to_s)
  203. end
  204. context "to which we add a permission to the middle role (accountants)" do
  205. setup do
  206. @count = MethodCallbackFuture.count
  207. @accountants_role.permissions << Permission.find_or_create_by_name("edit_parties")
  208. @future = MethodCallbackFuture.find(:first, :order => "id DESC")
  209. end
  210. should "instantiate a MethodCallbackFuture" do
  211. assert_equal @count + 1, MethodCallbackFuture.count
  212. end
  213. should "select all parties that are part of the role in the MethodCallbackFuture" do
  214. assert_equal [parties(:mary), parties(:peter)].map(&:name).map(&:to_s).sort,
  215. @future.models.map(&:name).map(&:to_s).sort
  216. end
  217. should "call \#generate_effective_permissions in the MethodCallbackFuture" do
  218. assert_equal "generate_effective_permissions", @future.method.to_s
  219. end
  220. end
  221. context "to which we add a permission to the bottom-most role (helpers)" do
  222. setup do
  223. @count = MethodCallbackFuture.count
  224. @helpers_role.permissions << Permission.find_or_create_by_name("view_parties")
  225. @future = MethodCallbackFuture.find(:first, :order => "id DESC")
  226. end
  227. should "instantiate a MethodCallbackFuture" do
  228. assert_equal @count + 1, MethodCallbackFuture.count
  229. end
  230. should "select all parties that are part of the role in the MethodCallbackFuture" do
  231. assert_equal [parties(:john), parties(:mary), parties(:peter)].map(&:name).map(&:to_s).sort,
  232. @future.models.map(&:name).map(&:to_s).sort
  233. end
  234. should "call \#generate_effective_permissions in the MethodCallbackFuture" do
  235. assert_equal "generate_effective_permissions", @future.method.to_s
  236. end
  237. end
  238. end
  239. end