import { AlbumResponseDto, AssetMediaResponseDto, LoginResponseDto, SharedLinkResponseDto, SharedLinkType, createAlbum, deleteUserAdmin, } from '@immich/sdk'; import { createUserDto, uuidDto } from 'src/fixtures'; import { errorDto } from 'src/responses'; import { app, asBearerAuth, shareUrl, utils } from 'src/utils'; import request from 'supertest'; import { beforeAll, describe, expect, it } from 'vitest'; describe('/shared-links', () => { let admin: LoginResponseDto; let asset1: AssetMediaResponseDto; let asset2: AssetMediaResponseDto; let user1: LoginResponseDto; let user2: LoginResponseDto; let album: AlbumResponseDto; let metadataAlbum: AlbumResponseDto; let deletedAlbum: AlbumResponseDto; let linkWithDeletedAlbum: SharedLinkResponseDto; let linkWithPassword: SharedLinkResponseDto; let linkWithAlbum: SharedLinkResponseDto; let linkWithAssets: SharedLinkResponseDto; let linkWithMetadata: SharedLinkResponseDto; let linkWithoutMetadata: SharedLinkResponseDto; beforeAll(async () => { await utils.resetDatabase(); admin = await utils.adminSetup(); [user1, user2] = await Promise.all([ utils.userSetup(admin.accessToken, createUserDto.user1), utils.userSetup(admin.accessToken, createUserDto.user2), ]); [asset1, asset2] = await Promise.all([utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken)]); [album, deletedAlbum, metadataAlbum] = await Promise.all([ createAlbum({ createAlbumDto: { albumName: 'album' } }, { headers: asBearerAuth(user1.accessToken) }), createAlbum({ createAlbumDto: { albumName: 'deleted album' } }, { headers: asBearerAuth(user2.accessToken) }), createAlbum( { createAlbumDto: { albumName: 'metadata album', assetIds: [asset1.id], }, }, { headers: asBearerAuth(user1.accessToken) }, ), ]); [linkWithDeletedAlbum, linkWithAlbum, linkWithAssets, linkWithPassword, linkWithMetadata, linkWithoutMetadata] = await Promise.all([ utils.createSharedLink(user2.accessToken, { type: SharedLinkType.Album, albumId: deletedAlbum.id, }), utils.createSharedLink(user1.accessToken, { type: SharedLinkType.Album, albumId: album.id, }), utils.createSharedLink(user1.accessToken, { type: SharedLinkType.Individual, assetIds: [asset1.id], }), utils.createSharedLink(user1.accessToken, { type: SharedLinkType.Album, albumId: album.id, password: 'foo', }), utils.createSharedLink(user1.accessToken, { type: SharedLinkType.Album, albumId: metadataAlbum.id, showMetadata: true, }), utils.createSharedLink(user1.accessToken, { type: SharedLinkType.Album, albumId: metadataAlbum.id, showMetadata: false, }), ]); await deleteUserAdmin({ id: user2.userId, userAdminDeleteDto: {} }, { headers: asBearerAuth(admin.accessToken) }); }); describe('GET /share/:key', () => { it('should have correct asset count in meta tag for non-empty album', async () => { const resp = await request(shareUrl).get(`/${linkWithMetadata.key}`); expect(resp.status).toBe(200); expect(resp.header['content-type']).toContain('text/html'); expect(resp.text).toContain( ``, ); }); it('should have correct asset count in meta tag for empty album', async () => { const resp = await request(shareUrl).get(`/${linkWithAlbum.key}`); expect(resp.status).toBe(200); expect(resp.header['content-type']).toContain('text/html'); expect(resp.text).toContain(``); }); it('should have correct asset count in meta tag for shared asset', async () => { const resp = await request(shareUrl).get(`/${linkWithAssets.key}`); expect(resp.status).toBe(200); expect(resp.header['content-type']).toContain('text/html'); expect(resp.text).toContain(``); }); it('should have fqdn og:image meta tag for shared asset', async () => { const resp = await request(shareUrl).get(`/${linkWithAssets.key}`); expect(resp.status).toBe(200); expect(resp.header['content-type']).toContain('text/html'); expect(resp.text).toContain(`