UNPKG

alepha

Version:

Easy-to-use modern TypeScript framework for building many kind of applications.

410 lines (354 loc) 11.4 kB
import { Alepha } from "alepha"; import { DbEntityNotFoundError } from "alepha/orm"; import { AlephaOrmPostgres } from "alepha/orm/postgres"; import { AlephaSecurity, type UserAccountToken } from "alepha/security"; import { describe, it } from "vitest"; import { AdminIdentityController, AlephaApiUsers, IdentityService, UserService, } from "../index.ts"; const adminUser: UserAccountToken = { id: "00000000-0000-0000-0000-000000000001", name: "Test Admin", roles: ["admin"], }; const setup = async () => { const alepha = Alepha.create({ env: { LOG_LEVEL: "error" }, }); alepha.with(AlephaOrmPostgres); alepha.with(AlephaSecurity); alepha.with(AlephaApiUsers); await alepha.start(); return { alepha, identityService: alepha.inject(IdentityService), userService: alepha.inject(UserService), controller: alepha.inject(AdminIdentityController), }; }; describe("alepha/api/users - AdminIdentityController", () => { it("should get an identity by ID", async ({ expect }) => { const { identityService, userService, controller } = await setup(); // Create a test user const user = await userService.users().create({ username: "identityuser", email: "identity@example.com", roles: ["user"], }); // Create an identity const identity = await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-123456", providerData: { name: "Test User", picture: "https://example.com/photo.jpg", }, }); const result = await controller.getIdentity( { params: { id: identity.id }, }, { user: adminUser }, ); expect(result.id).toBe(identity.id); expect(result.userId).toBe(user.id); expect(result.provider).toBe("google"); expect(result.providerUserId).toBe("google-123456"); expect(result.providerData).toEqual({ name: "Test User", picture: "https://example.com/photo.jpg", }); }); it("should throw error for non-existent identity", async ({ expect }) => { const { controller } = await setup(); await expect( controller.getIdentity( { params: { id: "550e8400-e29b-41d4-a716-446655440000" }, }, { user: adminUser }, ), ).rejects.toThrowError(DbEntityNotFoundError); }); it("should delete an identity", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "deleteidentityuser", email: "deleteidentity@example.com", roles: ["user"], }); const identity = await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-789", }); const result = await controller.deleteIdentity( { params: { id: identity.id }, }, { user: adminUser }, ); expect(result.ok).toBe(true); expect(result.id).toBe(identity.id); // Verify identity is deleted await expect( controller.getIdentity( { params: { id: identity.id }, }, { user: adminUser }, ), ).rejects.toThrowError(DbEntityNotFoundError); }); it("should find identities with pagination", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "multiidentityuser", email: "multiidentity@example.com", roles: ["user"], }); // Create multiple identities const identity1 = await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-1", }); const identity2 = await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-1", }); const identity3 = await identityService.identities().create({ userId: user.id, provider: "apple", providerUserId: "apple-1", }); const result = await controller.findIdentities( { query: { userId: user.id }, }, { user: adminUser }, ); expect(result.content.length).toBeGreaterThanOrEqual(3); // Verify all created identities are in the results const identityIds = result.content.map((i) => i.id); expect(identityIds).toContain(identity1.id); expect(identityIds).toContain(identity2.id); expect(identityIds).toContain(identity3.id); }); it("should filter identities by userId", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user1 = await userService.users().create({ username: "user1identity", email: "user1identity@example.com", roles: ["user"], }); const user2 = await userService.users().create({ username: "user2identity", email: "user2identity@example.com", roles: ["user"], }); await identityService.identities().create({ userId: user1.id, provider: "google", providerUserId: "google-user1-1", }); await identityService.identities().create({ userId: user1.id, provider: "github", providerUserId: "github-user1-1", }); await identityService.identities().create({ userId: user2.id, provider: "google", providerUserId: "google-user2-1", }); const result = await controller.findIdentities( { query: { userId: user1.id }, }, { user: adminUser }, ); expect(result.content.every((i) => i.userId === user1.id)).toBe(true); expect(result.content.length).toBeGreaterThanOrEqual(2); }); it("should filter identities by provider", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "providerfilteruser", email: "providerfilter@example.com", roles: ["user"], }); await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-1", }); await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-1", }); await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-2", }); const result = await controller.findIdentities( { query: { provider: "%google%" }, }, { user: adminUser }, ); expect(result.content.every((i) => i.provider === "google")).toBe(true); expect(result.content.length).toBeGreaterThanOrEqual(2); }); it("should sort identities by creation date (newest first)", async ({ expect, }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "sortidentityuser", email: "sortidentity@example.com", roles: ["user"], }); const identity1 = await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-sort-1", }); const identity2 = await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-sort-1", }); const identity3 = await identityService.identities().create({ userId: user.id, provider: "apple", providerUserId: "apple-sort-1", }); const result = await controller.findIdentities( { query: { userId: user.id }, }, { user: adminUser }, ); const identityIds = result.content.map((i) => i.id); expect(identityIds.indexOf(identity3.id)).toBeLessThan( identityIds.indexOf(identity2.id), ); expect(identityIds.indexOf(identity2.id)).toBeLessThan( identityIds.indexOf(identity1.id), ); }); it("should handle identities with provider data", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "providerdatauser", email: "providerdata@example.com", roles: ["user"], }); const googleIdentity = await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-data-1", providerData: { email: "test@gmail.com", verified_email: true, name: "Test User", picture: "https://example.com/photo.jpg", locale: "en", }, }); const githubIdentity = await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-data-1", providerData: { login: "testuser", avatar_url: "https://github.com/avatar.jpg", bio: "Software Developer", }, }); const googleResult = await controller.getIdentity( { params: { id: googleIdentity.id }, }, { user: adminUser }, ); expect(googleResult.providerData).toEqual({ email: "test@gmail.com", verified_email: true, name: "Test User", picture: "https://example.com/photo.jpg", locale: "en", }); const githubResult = await controller.getIdentity( { params: { id: githubIdentity.id }, }, { user: adminUser }, ); expect(githubResult.providerData).toEqual({ login: "testuser", avatar_url: "https://github.com/avatar.jpg", bio: "Software Developer", }); }); it("should handle identities without provider data", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "noproviderdatauser", email: "noproviderdata@example.com", roles: ["user"], }); const identity = await identityService.identities().create({ userId: user.id, provider: "custom", providerUserId: "custom-123", }); const result = await controller.getIdentity( { params: { id: identity.id }, }, { user: adminUser }, ); expect(result.providerData).toBeUndefined(); }); it("should handle multiple providers for same user", async ({ expect }) => { const { identityService, userService, controller } = await setup(); const user = await userService.users().create({ username: "multiprovideruser", email: "multiprovider@example.com", roles: ["user"], }); await identityService.identities().create({ userId: user.id, provider: "google", providerUserId: "google-multi-1", }); await identityService.identities().create({ userId: user.id, provider: "github", providerUserId: "github-multi-1", }); await identityService.identities().create({ userId: user.id, provider: "apple", providerUserId: "apple-multi-1", }); const result = await controller.findIdentities( { query: { userId: user.id }, }, { user: adminUser }, ); expect(result.content.length).toBe(3); const providers = result.content.map((i) => i.provider).sort(); expect(providers).toEqual(["apple", "github", "google"]); }); });