@ -1,21 +1,12 @@
import { describe , it , expect , beforeEach , vi } from "vitest" ;
import type {
getTriliumDataDir as getTriliumDataDirType ,
getDataDirs as getDataDirsType ,
getPlatformAppDataDir as getPlatformAppDataDirType ,
} from "../src/services/data_dir" ;
import type { getTriliumDataDir as getTriliumDataDirType , getDataDirs as getDataDirsType , getPlatformAppDataDir as getPlatformAppDataDirType } from "../src/services/data_dir" ;
describe ( "data_dir.ts unit tests" , async ( ) = > {
let getTriliumDataDir : typeof getTriliumDataDirType ;
let getPlatformAppDataDir : typeof getPlatformAppDataDirType ;
let getDataDirs : typeof getDataDirsType ;
const mockFn = {
existsSyncMock : vi.fn ( ) ,
mkdirSyncMock : vi.fn ( ) ,
@ -58,7 +49,7 @@ describe("data_dir.ts unit tests", async () => {
// helper to reset call counts
const resetAllMocks = ( ) = > {
Object . values ( mockFn ) . forEach ( ( mockedFn ) = > {
mockedFn . mockReset ( )
mockedFn . mockReset ( ) ;
} ) ;
} ;
@ -69,69 +60,33 @@ describe("data_dir.ts unit tests", async () => {
mockFn . pathJoinMock . mockImplementation ( ( ) = > pathJoin ) ;
} ;
describe ( "#getPlatformAppDataDir()" , ( ) = > {
type TestCaseGetPlatformAppDataDir = [
description : string ,
fnValue : Parameters < typeof getPlatformAppDataDir > ,
expectedValueFn : ( val : ReturnType < typeof getPlatformAppDataDir > ) = > boolean
]
type TestCaseGetPlatformAppDataDir = [ description : string , fnValue : Parameters < typeof getPlatformAppDataDir > , expectedValueFn : ( val : ReturnType < typeof getPlatformAppDataDir > ) = > boolean ] ;
const testCases : TestCaseGetPlatformAppDataDir [ ] = [
[ "w/ unsupported OS it should return 'null'" , [ "aix" , undefined ] , ( val ) = > val === null ] ,
[ "w/ win32 and no APPDATA set it should return 'null'" , [ "win32" , undefined ] , ( val ) = > val === null ] ,
[ "w/ win32 and set APPDATA it should return set 'APPDATA'" , [ "win32" , "AppData" ] , ( val ) = > val === "AppData" ] ,
[ "w/ linux it should return '/.local/share'" , [ "linux" , undefined ] , ( val ) = > val !== null && val . endsWith ( "/.local/share" ) ] ,
[
"w/ unsupported OS it should return 'null'" ,
[ "aix" , undefined ] ,
( val ) = > val === null
] ,
[
"w/ win32 and no APPDATA set it should return 'null'" ,
[ "win32" , undefined ] ,
( val ) = > val === null
] ,
[
"w/ win32 and set APPDATA it should return set 'APPDATA'" ,
[ "win32" , "AppData" ] ,
( val ) = > val === "AppData"
] ,
[
"w/ linux it should return '/.local/share'" ,
[ "linux" , undefined ] ,
( val ) = > val !== null && val . endsWith ( "/.local/share" )
] ,
[
"w/ linux and wrongly set APPDATA it should ignore APPDATA and return /.local/share" ,
[ "linux" , "FakeAppData" ] ,
( val ) = > val !== null && val . endsWith ( "/.local/share" )
] ,
[
"w/ darwin it should return /Library/Application Support" ,
[ "darwin" , undefined ] ,
( val ) = > val !== null && val . endsWith ( "/Library/Application Support" )
] ,
[ "w/ linux and wrongly set APPDATA it should ignore APPDATA and return /.local/share" , [ "linux" , "FakeAppData" ] , ( val ) = > val !== null && val . endsWith ( "/.local/share" ) ] ,
[ "w/ darwin it should return /Library/Application Support" , [ "darwin" , undefined ] , ( val ) = > val !== null && val . endsWith ( "/Library/Application Support" ) ]
] ;
testCases . forEach ( testCase = > {
testCases . forEach ( ( testCase ) = > {
const [ testDescription , value , isExpected ] = testCase ;
return it ( testDescription , ( ) = > {
const actual = getPlatformAppDataDir ( . . . value ) ;
const result = isExpected ( actual ) ;
expect ( result ) . toBeTruthy ( )
} )
} )
} )
expect ( result ) . toBeTruthy ( ) ;
} ) ;
} ) ;
} ) ;
describe ( "#getTriliumDataDir" , async ( ) = > {
beforeEach ( ( ) = > {
// make sure these are not set
delete process . env . TRILIUM_DATA_DIR ;
@ -147,7 +102,6 @@ describe("data_dir.ts unit tests", async () => {
* case D – fallback to creating Trilium folder in home dir
* /
describe ( "case A" , ( ) = > {
it ( "when folder exists – it should return the path, without attempting to create the folder" , async ( ) = > {
const mockTriliumDataPath = "/home/mock/trilium-data-ENV-A1" ;
@ -309,30 +263,22 @@ describe("data_dir.ts unit tests", async () => {
expect ( mockFn . mkdirSyncMock ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
} ) ;
} )
} ) ;
describe ( "#getDataDirs()" , ( ) = > {
const envKeys : Omit < keyof ReturnType < typeof getDataDirs > , "TRILIUM_DATA_DIR" > [ ] = [
"DOCUMENT_PATH" ,
"BACKUP_DIR" ,
"LOG_DIR" ,
"ANONYMIZED_DB_DIR" ,
"CONFIG_INI_PATH" ,
] ;
const envKeys : Omit < keyof ReturnType < typeof getDataDirs > , "TRILIUM_DATA_DIR" > [ ] = [ "DOCUMENT_PATH" , "BACKUP_DIR" , "LOG_DIR" , "ANONYMIZED_DB_DIR" , "CONFIG_INI_PATH" ] ;
const setMockedEnv = ( prefix : string | null ) = > {
envKeys . forEach ( key = > {
envKeys . forEach ( ( key ) = > {
if ( prefix ) {
process . env [ ` TRILIUM_ ${ key } ` ] = ` ${ prefix } _ ${ key } `
process . env [ ` TRILIUM_ ${ key } ` ] = ` ${ prefix } _ ${ key } ` ;
} else {
delete process . env [ ` TRILIUM_ ${ key } ` ]
delete process . env [ ` TRILIUM_ ${ key } ` ] ;
}
} )
} ) ;
} ;
it ( "w/ process.env values present, it should return an object using values from process.env" , ( ) = > {
// set mocked values
const mockValuePrefix = "MOCK" ;
setMockedEnv ( mockValuePrefix ) ;
@ -341,12 +287,11 @@ describe("data_dir.ts unit tests", async () => {
const result = getDataDirs ( ` ${ mockValuePrefix } _TRILIUM_DATA_DIR ` ) ;
for ( const key in result ) {
expect ( result [ key ] ) . toEqual ( ` ${ mockValuePrefix } _ ${ key } ` )
expect ( result [ key ] ) . toEqual ( ` ${ mockValuePrefix } _ ${ key } ` ) ;
}
} )
} ) ;
it ( "w/ NO process.env values present, it should return an object using supplied TRILIUM_DATA_DIR as base" , ( ) = > {
// make sure values are undefined
setMockedEnv ( null ) ;
@ -357,19 +302,17 @@ describe("data_dir.ts unit tests", async () => {
const result = getDataDirs ( mockDataDir ) ;
for ( const key in result ) {
expect ( result [ key ] . startsWith ( mockDataDir ) ) . toBeTruthy ( )
expect ( result [ key ] . startsWith ( mockDataDir ) ) . toBeTruthy ( ) ;
}
mockFn . pathJoinMock . mockReset ( )
} )
mockFn . pathJoinMock . mockReset ( ) ;
} ) ;
it ( "should ignore attempts to change a property on the returned object" , ( ) = > {
// make sure values are undefined
setMockedEnv ( null ) ;
const mockDataDirBase = "/home/test/MOCK_TRILIUM_DATA_DIR"
const mockDataDirBase = "/home/test/MOCK_TRILIUM_DATA_DIR" ;
const result = getDataDirs ( mockDataDirBase ) ;
// as per MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#description
@ -382,24 +325,21 @@ describe("data_dir.ts unit tests", async () => {
//@ts-expect-error - attempt to change value of readonly property
result . BACKUP_DIR = "attempt to change" ;
return result . BACKUP_DIR ;
} catch ( error ) {
return error ;
}
catch ( error ) {
return error
}
}
} ;
const changeAttemptResult = getChangeAttemptResult ( ) ;
if ( typeof changeAttemptResult === "string" ) {
// if it didn't throw above: assert that it did not change the value of it or any other keys of the object
for ( const key in result ) {
expect ( result [ key ] . startsWith ( mockDataDirBase ) ) . toBeTruthy ( )
expect ( result [ key ] . startsWith ( mockDataDirBase ) ) . toBeTruthy ( ) ;
}
} else {
expect ( changeAttemptResult ) . toBeInstanceOf ( TypeError )
expect ( changeAttemptResult ) . toBeInstanceOf ( TypeError ) ;
}
} )
} )
} ) ;
} ) ;
} ) ;