Files
fizzy/test/models/user/identifiable_test.rb
T
Mike Dalessio 3399e45130 Introduce an "Identity" model to ease login
- New untenanted Identity and Membership models
- New `identity_token` cookie with path "/" holds state across tenants

We're not sure whether the untenanted database will be sqlite or
MySQL, and so I've been careful to minimize

- database reads, placing them behind etags and caching
- database writes, only writing when a new Session is created (login)

Note that we track two things in the identity_token cookie: a signed
id, and the updated_at for the underlying Identity object. This allows
us to effectively cache on the Identity without having to hit the
database, by using an Identity::Mock object that is compatible with
etag and cache methods.

The new integration test shows the desired user-facing behavior, which
is to make it easy to login without a tenanted URL and to jump between
tenants.

- the untenanted "login_help" page shows all linked memberships
- the jump menu shows all linked memberships (except the current)

Also introduced a utility script to populate existing employee
Identities, grouping accounts by email address.
2025-10-10 10:12:25 -04:00

82 lines
2.8 KiB
Ruby

require "test_helper"
class User::IdentifiableTest < ActiveSupport::TestCase
test "set_identity when token is an identity and user has a matching identity" do
user = users(:david)
token_identity = Identity.create!
token_identity.memberships.create!(user_id: user.id, user_tenant: user.tenant, email_address: user.email_address, account_name: "asdf")
assert_equal(token_identity, user.identity)
result = user.set_identity(token_identity)
user.reload
assert_equal(token_identity, result)
assert_equal(token_identity, user.identity)
end
test "set_identity when token is an identity and user has no identity" do
user = users(:david)
token_identity = Identity.create!
assert_nil(user.membership)
assert_nil(user.identity)
result = user.set_identity(token_identity)
user.reload
assert_equal(token_identity, result)
assert_equal(token_identity, user.identity)
assert_equal(user.email_address, user.membership.email_address)
assert_equal(Account.sole.name, user.membership.account_name)
end
test "set_identity when token is an identity and user has a different identity" do
user = users(:david)
user2 = users(:jz)
token_identity = Identity.create!
user_identity = Identity.create!
user_identity.memberships.create!(user_id: user.id, user_tenant: user.tenant, email_address: user.email_address, account_name: "asdf")
user_identity.memberships.create!(user_id: user2.id, user_tenant: user2.tenant, email_address: user2.email_address, account_name: "qwer")
assert_equal(user_identity, user.identity)
assert_equal(user_identity, user2.identity)
result = user.set_identity(token_identity)
user.reload
user2.reload
assert_equal(token_identity, result)
assert_equal(token_identity, user.identity)
assert_equal(token_identity, user2.identity)
assert_raises(ActiveRecord::RecordNotFound) do
user_identity.reload
end
end
test "set_identity when token is nil and user has an identity" do
user = users(:david)
user_identity = Identity.create!
user_identity.memberships.create!(user_id: user.id, user_tenant: user.tenant, email_address: user.email_address, account_name: "asdf")
assert_equal(user_identity, user.identity)
result = user.set_identity(nil)
user.reload
assert_equal(user_identity, result)
assert_equal(user_identity, user.identity)
end
test "set_identity when token is nil and user has no identity" do
user = users(:david)
assert_nil(user.identity)
result = user.set_identity(nil)
user.reload
assert_not_nil(result)
assert_equal(result, user.identity)
assert_equal(1, result.memberships.count)
assert_equal(user.email_address, user.membership.email_address)
assert_equal(Account.sole.name, user.membership.account_name)
end
end