PageRenderTime 56ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/test/models/user_test.rb

https://gitlab.com/vectorci/samson
Ruby | 463 lines | 377 code | 86 blank | 0 comment | 25 complexity | 4bd52cb6750ea9bdbd58665a4cdd3d66 MD5 | raw file
  1. require_relative '../test_helper'
  2. SingleCov.covered!
  3. describe User do
  4. describe "#name" do
  5. let(:user) { User.new(name: username, email: 'test@test.com') }
  6. describe 'nil name' do
  7. let(:username) { nil }
  8. it 'falls back to the email' do
  9. user.name.must_equal('test@test.com')
  10. end
  11. end
  12. describe 'blank name' do
  13. let(:username) { '' }
  14. it 'falls back to the email' do
  15. user.name.must_equal('test@test.com')
  16. end
  17. end
  18. describe 'real name' do
  19. let(:username) { 'Hello' }
  20. it 'uses the name' do
  21. user.name.must_equal(username)
  22. end
  23. end
  24. end
  25. describe "#time_format" do
  26. let(:user) { User.create!(name: "jimbob", email: 'test@test.com') }
  27. it "has a default time format of relative" do
  28. user.time_format.must_equal('relative')
  29. end
  30. it "does not update with invalid values" do
  31. user.time_format = 'foobar'
  32. refute user.valid?
  33. end
  34. it "does update with valid values" do
  35. user.update_attributes!(time_format: 'utc')
  36. user.reload
  37. user.time_format.must_equal('utc')
  38. end
  39. it "allows initialization with different time_format" do
  40. local_user = User.create!(name: "bettysue", email: 'bsue@test.com', time_format: 'local')
  41. local_user.time_format.must_equal('local')
  42. end
  43. end
  44. describe "#gravatar url" do
  45. let(:user) { User.new(name: "User Name", email: email) }
  46. describe 'real email' do
  47. let(:email) { 'test@test.com' }
  48. it 'returns proper gravatar url' do
  49. email_digest = Digest::MD5.hexdigest('test@test.com')
  50. user.gravatar_url.must_equal("https://www.gravatar.com/avatar/#{email_digest}")
  51. end
  52. end
  53. describe 'nil email' do
  54. let(:email) { nil }
  55. it 'falls back to the default gravatar' do
  56. user.gravatar_url.must_equal('https://www.gravatar.com/avatar/default')
  57. end
  58. end
  59. describe 'empty email' do
  60. let(:email) { "" }
  61. it 'falls back to the default gravatar' do
  62. user.gravatar_url.must_equal('https://www.gravatar.com/avatar/default')
  63. end
  64. end
  65. end
  66. describe ".create_or_update_from_hash" do
  67. let(:user) { User.create_or_update_from_hash(auth_hash) }
  68. describe "with a new user" do
  69. let(:auth_hash) do
  70. {
  71. name: "Test User",
  72. email: "test@example.org",
  73. role_id: Role::ADMIN.id,
  74. external_id: 'strange-bug'
  75. }
  76. end
  77. it "creates a new user" do
  78. user.persisted?.must_equal(true)
  79. end
  80. it "sets the token" do
  81. user.token.must_match(/[a-z0-9]+/)
  82. end
  83. it "sets the role_id" do
  84. user.role_id.must_equal(Role::ADMIN.id)
  85. end
  86. it "creates a super admin for the first user" do
  87. User.delete_all
  88. user.role_id.must_equal(Role::SUPER_ADMIN.id)
  89. end
  90. end
  91. describe "with an existing user" do
  92. let(:auth_hash) do
  93. {
  94. name: "Test User",
  95. email: "test@example.org",
  96. external_id: 9,
  97. token: "abc123"
  98. }
  99. end
  100. let(:existing_user) do
  101. User.create!(name: "Test", external_id: 9)
  102. end
  103. before { existing_user }
  104. it "does not update the user" do
  105. user.name.must_equal("Test")
  106. user.token.wont_equal("abc123")
  107. end
  108. it "does update nil fields" do
  109. user.email.must_equal("test@example.org")
  110. end
  111. it "is the same user" do
  112. existing_user.id.must_equal(user.id)
  113. end
  114. describe "with a higher role_id" do
  115. let(:auth_hash) do
  116. {
  117. name: "Test User",
  118. email: "test@example.org",
  119. external_id: 9,
  120. role_id: Role::ADMIN.id
  121. }
  122. end
  123. before do
  124. existing_user.update_attributes!(role_id: Role::VIEWER.id)
  125. end
  126. it "is overwritten" do
  127. user.role_id.must_equal(Role::ADMIN.id)
  128. end
  129. end
  130. describe "with a lower role_id" do
  131. let(:auth_hash) do
  132. {
  133. name: "Test User",
  134. email: "test@example.org",
  135. external_id: 9,
  136. role_id: Role::VIEWER.id
  137. }
  138. end
  139. before do
  140. existing_user.update_attributes!(role_id: Role::ADMIN.id)
  141. end
  142. it "is ignored" do
  143. user.role_id.must_equal(Role::ADMIN.id)
  144. end
  145. end
  146. end
  147. end
  148. describe ".administrated_projects" do
  149. it "is all for admin" do
  150. users(:admin).administrated_projects.map(&:id).sort.must_equal Project.pluck(:id).sort
  151. end
  152. it "is allowed for project admin" do
  153. users(:project_admin).administrated_projects.map(&:permalink).sort.must_equal ['foo']
  154. end
  155. end
  156. describe "#super_admin?" do
  157. it "is true for a super admin" do
  158. users(:super_admin).must_be(:super_admin?)
  159. end
  160. it "is false for an admin" do
  161. users(:admin).wont_be(:super_admin?)
  162. end
  163. it "is false for deployer" do
  164. users(:deployer).wont_be(:super_admin?)
  165. end
  166. it "is false for a viewer" do
  167. User.new.wont_be(:super_admin?)
  168. end
  169. end
  170. describe "#deployer?" do
  171. it "is true for a super_admin" do
  172. users(:super_admin).deployer?.must_equal(true)
  173. end
  174. it "is true for an admin" do
  175. users(:admin).admin?.must_equal(true)
  176. end
  177. it "is false for a viewer" do
  178. User.new.wont_be(:deployer?)
  179. end
  180. end
  181. describe "#viewer?" do
  182. it "is true for a super_admin" do
  183. users(:super_admin).viewer?.must_equal(true)
  184. end
  185. it "is true for an admin" do
  186. users(:admin).viewer?.must_equal(true)
  187. end
  188. it "is true for a deployer" do
  189. users(:deployer).viewer?.must_equal(true)
  190. end
  191. it "is true for everyone else and by default" do
  192. User.new.viewer?.must_equal(true)
  193. end
  194. end
  195. describe ".search" do
  196. let!(:a_singular_user) do
  197. User.create!(name: 'FindMe', email: 'find.me@example.org')
  198. end
  199. let!(:some_similar_users) do
  200. (1..3).map { |index| User.create!(name: "TestUser#{index}", email: "some_email#{index}@example.org") }
  201. end
  202. it 'finds a single user' do
  203. User.search('FindMe').must_equal [a_singular_user]
  204. end
  205. it 'finds a single user using the email as query' do
  206. User.search('find.me@example.org').must_equal [a_singular_user]
  207. end
  208. it 'sanitizes query values' do
  209. User.search('%').must_equal []
  210. end
  211. it 'finds a single user using a partial match query' do
  212. User.search('find').must_equal [a_singular_user]
  213. end
  214. it 'finds multiple results using a partial match query' do
  215. User.search('TestUser').count.must_equal(3)
  216. end
  217. it 'fails to find any result' do
  218. User.search('does not exist').count.must_equal(0)
  219. end
  220. it 'returns all results with an empty query' do
  221. User.search('').count.must_equal(User.count)
  222. end
  223. it 'returns all results with a nil query' do
  224. User.search(nil).count.must_equal(User.count)
  225. end
  226. end
  227. describe ".with_role" do
  228. let(:project) { projects(:test) }
  229. let(:deployer_list) do
  230. [
  231. "Admin",
  232. "Deployer",
  233. "Deployer Project Admin",
  234. "DeployerBuddy",
  235. "Project Deployer",
  236. "Super Admin"
  237. ]
  238. end
  239. it "filters everything when asking for a unreachable role" do
  240. User.with_role(Role::SUPER_ADMIN.id + 1, project.id).size.must_equal 0
  241. end
  242. it "filters nothing when asking for anything" do
  243. User.with_role(Role::VIEWER.id, project.id).size.must_equal User.count
  244. end
  245. it 'filters by deployer' do
  246. User.with_role(Role::DEPLOYER.id, project.id).map(&:name).sort.must_equal \
  247. deployer_list
  248. end
  249. it 'filters by admin' do
  250. User.with_role(Role::ADMIN.id, project.id).map(&:name).sort.must_equal \
  251. ["Admin", "Deployer Project Admin", "Super Admin"]
  252. end
  253. describe "with another project" do
  254. let(:other) do
  255. p = project.dup
  256. p.name = 'xxxxx'
  257. p.save!(validate: false)
  258. p
  259. end
  260. it 'does not show duplicate when multiple roles exist' do
  261. UserProjectRole.create!(user: users(:project_admin), project: other, role_id: Role::ADMIN.id)
  262. User.with_role(Role::DEPLOYER.id, project.id).map(&:name).sort.must_equal \
  263. deployer_list
  264. end
  265. it 'shows users that only have a role on different projects' do
  266. UserProjectRole.create!(user: users(:deployer), project: other, role_id: Role::ADMIN.id)
  267. User.with_role(Role::DEPLOYER.id, project.id).map(&:name).sort.must_equal \
  268. deployer_list
  269. end
  270. end
  271. end
  272. describe 'soft delete!' do
  273. let(:user) { User.create!(name: 'to_delete', email: 'to_delete@test.com') }
  274. let!(:locks) do
  275. %i[test_staging test_production].map { |stage| user.locks.create!(stage: stages(stage)) }
  276. end
  277. it 'soft deletes all the user locks when the user is soft deleted' do
  278. user.soft_delete!
  279. locks.each { |lock| lock.reload.deleted_at.wont_be_nil }
  280. end
  281. end
  282. describe "#admin_for_project?" do
  283. it "is true for a user that has been granted the role of project admin" do
  284. users(:project_admin).admin_for?(projects(:test)).must_equal(true)
  285. end
  286. it "is true for a user that are admins" do
  287. users(:admin).admin_for?(projects(:test)).must_equal(true)
  288. users(:super_admin).admin_for?(projects(:test)).must_equal(true)
  289. end
  290. it "is false for users that have not been granted the role of project admin" do
  291. users(:viewer).admin_for?(projects(:test)).must_equal(false)
  292. users(:deployer).admin_for?(projects(:test)).must_equal(false)
  293. end
  294. end
  295. describe "#deployer_for_project?" do
  296. it "is true for a user that has been granted the role of project deployer" do
  297. users(:project_deployer).deployer_for?(projects(:test)).must_equal(true)
  298. end
  299. it "is true for a user that has been granted the role of project admin" do
  300. users(:project_admin).deployer_for?(projects(:test)).must_equal(true)
  301. end
  302. it "is false for users that have not been granted the roles of project deployer or project admin" do
  303. users(:viewer).deployer_for?(projects(:test)).must_equal(false)
  304. end
  305. it "is true for deployers" do
  306. users(:deployer).deployer_for?(projects(:test)).must_equal(true)
  307. users(:admin).deployer_for?(projects(:test)).must_equal(true)
  308. users(:super_admin).deployer_for?(projects(:test)).must_equal(true)
  309. end
  310. end
  311. describe "#project_role_for" do
  312. it "returns the project role for the given project" do
  313. users(:project_admin).project_role_for(projects(:test)).must_equal user_project_roles(:project_admin)
  314. end
  315. end
  316. describe "#starred_project?" do
  317. let(:user) { users(:viewer) }
  318. let(:project) { projects(:test) }
  319. it "is true when starred" do
  320. user.stars.create!(project: project)
  321. user.starred_project?(project).must_equal true
  322. end
  323. it "is false when not starred" do
  324. user.starred_project?(project).must_equal false
  325. end
  326. it "is cached" do
  327. user.stars.expects(:pluck).returns []
  328. user.starred_project?(project).must_equal false
  329. user.stars.expects(:pluck).never
  330. user.starred_project?(project).must_equal false
  331. end
  332. it "expires the cache when a new star is created" do
  333. user.starred_project?(project).must_equal false
  334. user.stars.create!(project: project)
  335. user.starred_project?(project).must_equal true
  336. end
  337. it "expires the cache when a star is deleted" do
  338. star = user.stars.create!(project: project)
  339. user.starred_project?(project).must_equal true
  340. star.destroy
  341. user.starred_project?(project).must_equal false
  342. end
  343. end
  344. describe "versioning" do
  345. let(:user) { users(:admin) }
  346. around { |t| PaperTrail.with_logging(&t) }
  347. it "tracks important changes" do
  348. user.update_attributes!(name: "Foo")
  349. user.versions.size.must_equal 1
  350. end
  351. it "ignores unimportant changes" do
  352. user.update_attributes!(updated_at: 1.second.from_now)
  353. user.versions.size.must_equal 0
  354. end
  355. it "ignores sensitive changes" do
  356. user.update_attributes!(token: 'secret')
  357. user.versions.size.must_equal 0
  358. end
  359. it "records project_roles change" do
  360. UserProjectRole.create!(project: projects(:test), user: user, role_id: 1)
  361. user.versions.size.must_equal 1
  362. YAML.load(user.versions.first.object)['project_roles'].must_equal "foo" => 1
  363. end
  364. it "records project_roles destruction" do
  365. role = UserProjectRole.create!(project: projects(:test), user: user, role_id: 1)
  366. role.reload
  367. role.destroy
  368. user.versions.size.must_equal 2
  369. YAML.load(user.versions.last.object)['project_roles'].must_equal({})
  370. end
  371. end
  372. describe "#name_and_email" do
  373. it "is name and email" do
  374. users(:admin).name_and_email.must_equal "Admin (admin@example.com)"
  375. end
  376. end
  377. end