@@ -3,7 +3,8 @@ import * as React from "react";
33import { describe , it , expect , vi , beforeEach } from "vitest" ;
44
55import { MediaLibrary } from "../../src/components/MediaLibrary" ;
6- import type { MediaItem } from "../../src/lib/api" ;
6+ import { fetchMediaProviders , fetchProviderMedia } from "../../src/lib/api" ;
7+ import type { MediaItem , MediaProviderItem } from "../../src/lib/api" ;
78import { render } from "../utils/render.tsx" ;
89
910// ---------------------------------------------------------------------------
@@ -92,14 +93,54 @@ describe("MediaLibrary", () => {
9293 } ) ;
9394
9495 it ( "grid thumbnails are natively lazy-loaded" , async ( ) => {
95- // A library page can hold up to 100 items; without `loading="lazy"` the
96+ // A library page can hold up to 40 items; without `loading="lazy"` the
9697 // browser fetches every thumbnail on mount instead of only the visible ones.
9798 const items = [ makeMediaItem ( { id : "1" , filename : "pic.jpg" , mimeType : "image/jpeg" } ) ] ;
9899 const screen = await renderLibrary ( { items } ) ;
99100 await expect . element ( screen . getByAltText ( "pic.jpg" ) ) . toHaveAttribute ( "loading" , "lazy" ) ;
100101 } ) ;
101102 } ) ;
102103
104+ describe ( "provider thumbnails" , ( ) => {
105+ function makeProviderItem ( overrides : Partial < MediaProviderItem > = { } ) : MediaProviderItem {
106+ return {
107+ id : "provider_01" ,
108+ filename : "cloud-pic.jpg" ,
109+ mimeType : "image/jpeg" ,
110+ previewUrl : "https://provider.example.com/cloud-pic.jpg" ,
111+ width : 800 ,
112+ height : 600 ,
113+ ...overrides ,
114+ } ;
115+ }
116+
117+ function mockProvider ( items : MediaProviderItem [ ] ) {
118+ vi . mocked ( fetchMediaProviders ) . mockResolvedValue ( [
119+ {
120+ id : "acme" ,
121+ name : "Acme Provider" ,
122+ capabilities : { upload : false , search : false , delete : false } ,
123+ } ,
124+ ] ) ;
125+ vi . mocked ( fetchProviderMedia ) . mockResolvedValue ( { items } ) ;
126+ }
127+
128+ it ( "provider grid thumbnails are natively lazy-loaded" , async ( ) => {
129+ mockProvider ( [ makeProviderItem ( ) ] ) ;
130+ const screen = await renderLibrary ( ) ;
131+ await screen . getByRole ( "button" , { name : "Acme Provider" } ) . click ( ) ;
132+ await expect . element ( screen . getByAltText ( "cloud-pic.jpg" ) ) . toHaveAttribute ( "loading" , "lazy" ) ;
133+ } ) ;
134+
135+ it ( "provider list thumbnails are natively lazy-loaded" , async ( ) => {
136+ mockProvider ( [ makeProviderItem ( ) ] ) ;
137+ const screen = await renderLibrary ( ) ;
138+ await screen . getByRole ( "button" , { name : "Acme Provider" } ) . click ( ) ;
139+ await screen . getByRole ( "button" , { name : "List view" } ) . click ( ) ;
140+ await expect . element ( screen . getByAltText ( "cloud-pic.jpg" ) ) . toHaveAttribute ( "loading" , "lazy" ) ;
141+ } ) ;
142+ } ) ;
143+
103144 describe ( "view mode toggle" , ( ) => {
104145 it ( "switches between grid and list view" , async ( ) => {
105146 const items = [ makeMediaItem ( { id : "1" , filename : "test.jpg" } ) ] ;
0 commit comments