33 * Licensed under the MIT License.
44 */
55
6+ import { strict as assert } from "assert" ;
7+
68import {
9+ asLegacyAlpha ,
710 createDetachedContainer ,
8- type IContainerExperimental ,
911 loadFrozenContainerFromPendingState ,
1012} from "@fluidframework/container-loader/internal" ;
1113import type { FluidObject } from "@fluidframework/core-interfaces/internal" ;
12- import { assert } from "@fluidframework/core-utils/internal" ;
14+ import type { ISharedMap } from "@fluidframework/map/internal" ;
15+ import { isFluidHandle , toFluidHandleInternal } from "@fluidframework/runtime-utils/internal" ;
1316import { LocalDeltaConnectionServer } from "@fluidframework/server-local-server" ;
1417import { timeoutPromise , type TestFluidObject } from "@fluidframework/test-utils/internal" ;
1518
1619import { createLoader } from "../utils.js" ;
1720
21+ const toComparableArray = ( dir : ISharedMap ) : [ string , unknown ] [ ] =>
22+ [ ...dir . entries ( ) ] . map ( ( [ key , value ] ) => [
23+ key ,
24+ isFluidHandle ( value ) ? toFluidHandleInternal ( value ) . absolutePath : value ,
25+ ] ) ;
26+
1827describe ( "loadFrozenContainerFromPendingState" , ( ) => {
1928 it ( "loadFrozenContainerFromPendingState" , async ( ) => {
2029 const deltaConnectionServer = LocalDeltaConnectionServer . create ( ) ;
2130
2231 const { urlResolver, codeDetails, codeLoader, loaderProps } = createLoader ( {
2332 deltaConnectionServer,
2433 } ) ;
25- const container : IContainerExperimental = await createDetachedContainer ( {
26- codeDetails,
27- ...loaderProps ,
28- configProvider : {
29- getRawConfig : ( name ) => {
30- switch ( name ) {
31- case "Fluid.Container.enableOfflineLoad" :
32- return true ;
33- default :
34- return undefined ;
35- }
34+ const container = asLegacyAlpha (
35+ await createDetachedContainer ( {
36+ codeDetails,
37+ ...loaderProps ,
38+ configProvider : {
39+ getRawConfig : ( name ) => {
40+ switch ( name ) {
41+ case "Fluid.Container.enableOfflineLoad" :
42+ return true ;
43+ default :
44+ return undefined ;
45+ }
46+ } ,
3647 } ,
37- } ,
38- } ) ;
48+ } ) ,
49+ ) ;
3950 const { ITestFluidObject } : FluidObject < TestFluidObject > =
4051 ( await container . getEntryPoint ( ) ) ?? { } ;
41- assert ( ITestFluidObject !== undefined , "entrypoint must be test object" ) ;
52+ assert (
53+ ITestFluidObject !== undefined ,
54+ "Expected entrypoint to be a valid TestFluidObject, but it was undefined" ,
55+ ) ;
4256
4357 for ( let i = 0 ; i < 10 ; i ++ ) {
4458 ITestFluidObject . root . set ( `detached-${ i } ` , i ) ;
@@ -49,15 +63,17 @@ describe("loadFrozenContainerFromPendingState", () => {
4963 ITestFluidObject . root . set ( `attached-${ i } ` , i ) ;
5064 }
5165 const url = await container . getAbsoluteUrl ( "" ) ;
52- assert ( url !== undefined , "url must exist" ) ;
66+ assert (
67+ url !== undefined ,
68+ "Expected container to provide a valid absolute URL, but got undefined" ,
69+ ) ;
5370
5471 container . disconnect ( ) ;
5572 for ( let i = 0 ; i < 10 ; i ++ ) {
5673 ITestFluidObject . root . set ( `disconnected-${ i } ` , i ) ;
5774 }
5875
59- const pendingLocalState = await container . getPendingLocalState ?.( ) ;
60- assert ( pendingLocalState !== undefined , "must have pending state" ) ;
76+ const pendingLocalState = await container . getPendingLocalState ( ) ;
6177
6278 const frozenContainer = await loadFrozenContainerFromPendingState ( {
6379 codeLoader,
@@ -68,15 +84,28 @@ describe("loadFrozenContainerFromPendingState", () => {
6884 pendingLocalState,
6985 } ) ;
7086
71- assert ( frozenContainer . readOnlyInfo . readonly === true , "must be readonly" ) ;
72- assert ( frozenContainer . readOnlyInfo . storageOnly === true , "must be readonly" ) ;
87+ assert (
88+ frozenContainer . readOnlyInfo . readonly === true ,
89+ "Expected frozen container to be in readonly mode, but it was not" ,
90+ ) ;
91+ assert (
92+ frozenContainer . readOnlyInfo . storageOnly === true ,
93+ "Expected frozen container to be storage-only, but it was not" ,
94+ ) ;
7395
7496 const frozenEntryPoint : FluidObject < TestFluidObject > =
7597 await frozenContainer . getEntryPoint ( ) ;
76- assert ( frozenEntryPoint . ITestFluidObject !== undefined , "entrypoint must be test object" ) ;
98+ assert (
99+ frozenEntryPoint . ITestFluidObject !== undefined ,
100+ "Expected frozen container entrypoint to be a valid TestFluidObject, but it was undefined" ,
101+ ) ;
77102
78- const frozenEntries = [ ...frozenEntryPoint . ITestFluidObject . root . entries ( ) ] ;
79- assert ( frozenEntries . length === [ ...ITestFluidObject . root . entries ( ) ] . length , "Must match" ) ;
103+ const frozenEntries = toComparableArray ( frozenEntryPoint . ITestFluidObject . root ) ;
104+ assert . deepEqual (
105+ frozenEntries ,
106+ toComparableArray ( ITestFluidObject . root ) ,
107+ "Expected frozen container's data to match the original container's state after pending local state was captured." ,
108+ ) ;
80109
81110 container . connect ( ) ;
82111 for ( let i = 0 ; i < 10 ; i ++ ) {
@@ -86,13 +115,15 @@ describe("loadFrozenContainerFromPendingState", () => {
86115 if ( container . isDirty ) {
87116 await timeoutPromise ( ( resolve ) => container . once ( "saved" , ( ) => resolve ( ) ) ) ;
88117 }
89- assert (
90- frozenEntries . length !== [ ...ITestFluidObject . root . entries ( ) ] . length ,
91- "Must not match after new changes" ,
118+ assert . notDeepEqual (
119+ frozenEntries ,
120+ toComparableArray ( ITestFluidObject . root ) ,
121+ "Expected frozen container's data to differ from the original container after new changes were made post-pending state." ,
92122 ) ;
93- assert (
94- frozenEntries . length === [ ...frozenEntryPoint . ITestFluidObject . root . entries ( ) ] . length ,
95- "Must match as frozen container shouldn't get any new changes" ,
123+ assert . deepEqual (
124+ frozenEntries ,
125+ toComparableArray ( frozenEntryPoint . ITestFluidObject . root ) ,
126+ "Expected frozen container's data to remain unchanged after new changes in the original container." ,
96127 ) ;
97128 } ) ;
98129} ) ;
0 commit comments