2023-04-04 04:50:22 +00:00
import ' dart:io ' ;
2023-05-21 10:53:59 +00:00
import ' package:appflowy/core/config/kv_keys.dart ' ;
2023-04-04 04:50:22 +00:00
import ' package:archive/archive_io.dart ' ;
import ' package:flutter/services.dart ' ;
import ' package:path/path.dart ' as p ;
import ' package:path_provider/path_provider.dart ' ;
import ' package:shared_preferences/shared_preferences.dart ' ;
enum TestWorkspace {
board ( " board " ) ,
2023-05-03 07:22:16 +00:00
emptyDocument ( " empty_document " ) ,
2023-05-03 07:43:11 +00:00
aiWorkSpace ( " ai_workspace " ) ,
2023-05-03 07:22:16 +00:00
coverImage ( " cover_image " ) ;
2023-04-04 04:50:22 +00:00
const TestWorkspace ( this . _name ) ;
final String _name ;
Future < File > get zip async {
final Directory parent = await TestWorkspace . _parent ;
final File out = File ( p . join ( parent . path , ' $ _name .zip ' ) ) ;
if ( await out . exists ( ) ) return out ;
await out . create ( ) ;
final ByteData data = await rootBundle . load ( _asset ) ;
await out . writeAsBytes ( data . buffer . asUint8List ( ) ) ;
return out ;
}
Future < Directory > get root async {
final Directory parent = await TestWorkspace . _parent ;
return Directory ( p . join ( parent . path , _name ) ) ;
}
static Future < Directory > get _parent async {
final Directory root = await getTemporaryDirectory ( ) ;
if ( await root . exists ( ) ) return root ;
await root . create ( ) ;
return root ;
}
String get _asset = > ' assets/test/workspaces/ $ _name .zip ' ;
}
class TestWorkspaceService {
const TestWorkspaceService ( this . workspace ) ;
final TestWorkspace workspace ;
/// Instructs the application to read workspace data from the workspace found under this [TestWorkspace]'s path.
Future < void > setUpAll ( ) async {
2023-06-11 06:19:44 +00:00
final root = await workspace . root ;
final path = root . path ;
2023-04-04 04:50:22 +00:00
SharedPreferences . setMockInitialValues (
{
2023-06-11 06:19:44 +00:00
KVKeys . pathLocation: path ,
2023-04-04 04:50:22 +00:00
} ,
) ;
}
/// Workspaces that are checked into source are compressed. [TestWorkspaceService.setUp()] decompresses the file into an ephemeral directory that will be ignored by source control.
Future < void > setUp ( ) async {
final inputStream =
InputFileStream ( await workspace . zip . then ( ( value ) = > value . path ) ) ;
final archive = ZipDecoder ( ) . decodeBuffer ( inputStream ) ;
extractArchiveToDisk (
2023-04-10 07:10:42 +00:00
archive ,
await TestWorkspace . _parent . then ( ( value ) = > value . path ) ,
) ;
2023-04-04 04:50:22 +00:00
}
}