2023-04-11 14:08:56 -04:00
import { expect } from 'chai'
import type { FileDiff } from '../../../../../frontend/js/features/history/services/types/file'
import { autoSelectFile } from '../../../../../frontend/js/features/history/utils/auto-select-file'
import type { User } from '../../../../../frontend/js/features/history/services/types/shared'
2023-04-24 09:55:07 -04:00
import { LoadedUpdate } from '../../../../../frontend/js/features/history/services/types/update'
2023-05-16 04:17:57 -04:00
import { fileFinalPathname } from '../../../../../frontend/js/features/history/utils/file-diff'
2023-05-24 06:02:21 -04:00
import { getUpdateForVersion } from '../../../../../frontend/js/features/history/utils/history-details'
2023-04-11 14:08:56 -04:00
describe ( 'autoSelectFile' , function ( ) {
const historyUsers : User [ ] = [
{
first_name : 'first_name' ,
last_name : 'last_name' ,
email : 'email@overleaf.com' ,
id : '6266xb6b7a366460a66186xx' ,
} ,
]
2023-04-14 06:57:41 -04:00
describe ( 'for comparing version with previous' , function ( ) {
const comparing = false
2023-04-11 14:08:56 -04:00
it ( 'return the file with `edited` as the last operation' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'main.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'sample.bib' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'frog.jpg' ,
2023-05-25 06:20:57 -04:00
editable : false ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfile5.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfolder1/newfolder2/newfile2.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfolder1/newfile10.tex' ,
operation : 'edited' ,
} ,
]
2023-04-24 09:55:07 -04:00
const updates : LoadedUpdate [ ] = [
2023-04-11 14:08:56 -04:00
{
fromV : 25 ,
toV : 26 ,
meta : {
users : historyUsers ,
start_ts : 1680888731881 ,
end_ts : 1680888731881 ,
} ,
labels : [ ] ,
pathnames : [ 'newfolder1/newfile10.tex' ] ,
project_ops : [ ] ,
} ,
{
fromV : 23 ,
toV : 25 ,
meta : {
users : historyUsers ,
start_ts : 1680888725098 ,
end_ts : 1680888729123 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'newfolder1/newfile3.tex' ,
newPathname : 'newfolder1/newfile10.tex' ,
} ,
atV : 24 ,
} ,
{
rename : {
pathname : 'newfile3.tex' ,
newPathname : 'newfolder1/newfile3.tex' ,
} ,
atV : 23 ,
} ,
] ,
} ,
{
fromV : 22 ,
toV : 23 ,
meta : {
users : historyUsers ,
start_ts : 1680888721015 ,
end_ts : 1680888721015 ,
} ,
labels : [ ] ,
pathnames : [ 'newfile3.tex' ] ,
project_ops : [ ] ,
} ,
{
fromV : 19 ,
toV : 22 ,
meta : {
users : historyUsers ,
start_ts : 1680888715364 ,
end_ts : 1680888718726 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'newfolder1/newfolder2/newfile3.tex' ,
newPathname : 'newfile3.tex' ,
} ,
atV : 21 ,
} ,
{
rename : {
pathname : 'newfolder1/newfile2.tex' ,
newPathname : 'newfolder1/newfolder2/newfile2.tex' ,
} ,
atV : 20 ,
} ,
{
rename : {
pathname : 'newfolder1/newfile5.tex' ,
newPathname : 'newfile5.tex' ,
} ,
atV : 19 ,
} ,
] ,
} ,
{
fromV : 16 ,
toV : 19 ,
meta : {
users : historyUsers ,
start_ts : 1680888705042 ,
end_ts : 1680888712662 ,
} ,
labels : [ ] ,
pathnames : [
'main.tex' ,
'newfolder1/newfile2.tex' ,
'newfolder1/newfile5.tex' ,
] ,
project_ops : [ ] ,
} ,
{
fromV : 0 ,
toV : 16 ,
meta : {
users : historyUsers ,
start_ts : 1680888456499 ,
end_ts : 1680888640774 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'newfolder1/newfile2.tex' ,
} ,
atV : 15 ,
} ,
{
remove : {
pathname : 'newfile2.tex' ,
} ,
atV : 14 ,
} ,
{
rename : {
pathname : 'newfolder1/frog.jpg' ,
newPathname : 'frog.jpg' ,
} ,
atV : 13 ,
} ,
{
rename : {
pathname : 'newfolder1/newfile2.tex' ,
newPathname : 'newfile2.tex' ,
} ,
atV : 12 ,
} ,
{
rename : {
pathname : 'newfile5.tex' ,
newPathname : 'newfolder1/newfile5.tex' ,
} ,
atV : 11 ,
} ,
{
rename : {
pathname : 'newfile4.tex' ,
newPathname : 'newfile5.tex' ,
} ,
atV : 10 ,
} ,
{
add : {
pathname : 'newfile4.tex' ,
} ,
atV : 9 ,
} ,
{
remove : {
pathname : 'newfolder1/newfolder2/newfile1.tex' ,
} ,
atV : 8 ,
} ,
{
rename : {
pathname : 'frog.jpg' ,
newPathname : 'newfolder1/frog.jpg' ,
} ,
atV : 7 ,
} ,
{
add : {
pathname : 'newfolder1/newfolder2/newfile3.tex' ,
} ,
atV : 6 ,
} ,
{
add : {
pathname : 'newfolder1/newfile2.tex' ,
} ,
atV : 5 ,
} ,
{
rename : {
pathname : 'newfolder1/newfile1.tex' ,
newPathname : 'newfolder1/newfolder2/newfile1.tex' ,
} ,
atV : 4 ,
} ,
{
add : {
pathname : 'newfolder1/newfile1.tex' ,
} ,
atV : 3 ,
} ,
{
add : {
pathname : 'frog.jpg' ,
} ,
atV : 2 ,
} ,
{
add : {
pathname : 'sample.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
2023-04-27 14:45:13 -04:00
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-04-27 14:45:13 -04:00
)
2023-04-14 06:57:41 -04:00
expect ( pathname ) . to . equal ( 'newfolder1/newfile10.tex' )
2023-04-11 14:08:56 -04:00
} )
2023-04-14 06:57:41 -04:00
2023-04-11 14:08:56 -04:00
it ( 'return file with `added` operation on highest `atV` value if no other operation is available on the latest `updates` entry' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'main.tex' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'sample.bib' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'frog.jpg' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : false ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfile1.tex' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
]
2023-04-24 09:55:07 -04:00
const updates : LoadedUpdate [ ] = [
2023-04-11 14:08:56 -04:00
{
fromV : 0 ,
toV : 4 ,
meta : {
users : historyUsers ,
start_ts : 1680861468999 ,
end_ts : 1680861491861 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'newfile1.tex' ,
} ,
atV : 3 ,
} ,
{
add : {
pathname : 'frog.jpg' ,
} ,
atV : 2 ,
} ,
{
add : {
pathname : 'sample.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
2023-04-27 14:45:13 -04:00
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-04-27 14:45:13 -04:00
)
2023-04-11 14:08:56 -04:00
2023-04-14 06:57:41 -04:00
expect ( pathname ) . to . equal ( 'newfile1.tex' )
2023-04-11 14:08:56 -04:00
} )
it ( 'return the last non-`removed` operation with the highest `atV` value' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'main.tex' ,
operation : 'removed' ,
deletedAtV : 6 ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'sample.bib' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'main2.tex' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'main3.tex' ,
operation : 'added' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
]
2023-04-24 09:55:07 -04:00
const updates : LoadedUpdate [ ] = [
2023-04-11 14:08:56 -04:00
{
fromV : 4 ,
toV : 7 ,
meta : {
users : historyUsers ,
start_ts : 1680874742389 ,
end_ts : 1680874755552 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
remove : {
pathname : 'main.tex' ,
} ,
atV : 6 ,
} ,
{
add : {
pathname : 'main3.tex' ,
} ,
atV : 5 ,
} ,
{
add : {
pathname : 'main2.tex' ,
} ,
atV : 4 ,
} ,
] ,
} ,
{
fromV : 0 ,
toV : 4 ,
meta : {
users : historyUsers ,
start_ts : 1680861975947 ,
end_ts : 1680861988442 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
remove : {
pathname : 'frog.jpg' ,
} ,
atV : 3 ,
} ,
{
add : {
pathname : 'frog.jpg' ,
} ,
atV : 2 ,
} ,
{
add : {
pathname : 'sample.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
2023-04-27 14:45:13 -04:00
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-04-27 14:45:13 -04:00
)
2023-04-11 14:08:56 -04:00
2023-04-14 06:57:41 -04:00
expect ( pathname ) . to . equal ( 'main3.tex' )
2023-04-11 14:08:56 -04:00
} )
it ( 'if `removed` is the last operation, and no other operation is available on the latest `updates` entry, with `main.tex` available as a file name somewhere in the file tree, return `main.tex`' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'main.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'sample.bib' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'frog.jpg' ,
2023-05-25 06:20:57 -04:00
editable : false ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfolder/maybewillbedeleted.tex' ,
newPathname : 'newfolder2/maybewillbedeleted.tex' ,
operation : 'removed' ,
deletedAtV : 10 ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
]
2023-04-24 09:55:07 -04:00
const updates : LoadedUpdate [ ] = [
2023-04-11 14:08:56 -04:00
{
fromV : 9 ,
toV : 11 ,
meta : {
users : historyUsers ,
start_ts : 1680904414419 ,
end_ts : 1680904417538 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
remove : {
pathname : 'newfolder2/maybewillbedeleted.tex' ,
} ,
atV : 10 ,
} ,
{
rename : {
pathname : 'newfolder/maybewillbedeleted.tex' ,
newPathname : 'newfolder2/maybewillbedeleted.tex' ,
} ,
atV : 9 ,
} ,
] ,
} ,
{
fromV : 8 ,
toV : 9 ,
meta : {
users : historyUsers ,
start_ts : 1680904410333 ,
end_ts : 1680904410333 ,
} ,
labels : [ ] ,
pathnames : [ 'newfolder/maybewillbedeleted.tex' ] ,
project_ops : [ ] ,
} ,
{
fromV : 7 ,
toV : 8 ,
meta : {
users : historyUsers ,
start_ts : 1680904407448 ,
end_ts : 1680904407448 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'newfolder/tobedeleted.tex' ,
newPathname : 'newfolder/maybewillbedeleted.tex' ,
} ,
atV : 7 ,
} ,
] ,
} ,
{
fromV : 6 ,
toV : 7 ,
meta : {
users : historyUsers ,
start_ts : 1680904400839 ,
end_ts : 1680904400839 ,
} ,
labels : [ ] ,
pathnames : [ 'newfolder/tobedeleted.tex' ] ,
project_ops : [ ] ,
} ,
{
fromV : 5 ,
toV : 6 ,
meta : {
users : historyUsers ,
start_ts : 1680904398544 ,
end_ts : 1680904398544 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'tobedeleted.tex' ,
newPathname : 'newfolder/tobedeleted.tex' ,
} ,
atV : 5 ,
} ,
] ,
} ,
{
fromV : 4 ,
toV : 5 ,
meta : {
users : historyUsers ,
start_ts : 1680904389891 ,
end_ts : 1680904389891 ,
} ,
labels : [ ] ,
pathnames : [ 'tobedeleted.tex' ] ,
project_ops : [ ] ,
} ,
{
fromV : 0 ,
toV : 4 ,
meta : {
users : historyUsers ,
start_ts : 1680904363778 ,
end_ts : 1680904385308 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'tobedeleted.tex' ,
} ,
atV : 3 ,
} ,
{
add : {
pathname : 'frog.jpg' ,
} ,
atV : 2 ,
} ,
{
add : {
pathname : 'sample.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
2023-04-27 14:45:13 -04:00
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-04-27 14:45:13 -04:00
)
2023-04-11 14:08:56 -04:00
2023-04-14 06:57:41 -04:00
expect ( pathname ) . to . equal ( 'main.tex' )
2023-04-11 14:08:56 -04:00
} )
it ( 'if `removed` is the last operation, and no other operation is available on the latest `updates` entry, with `main.tex` is not available as a file name somewhere in the file tree, return any tex file based on ascending alphabetical order' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'certainly_not_main.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'newfile.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
{
pathname : 'file2.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-04-11 14:08:56 -04:00
} ,
]
2023-04-24 09:55:07 -04:00
const updates : LoadedUpdate [ ] = [
2023-04-11 14:08:56 -04:00
{
fromV : 7 ,
toV : 8 ,
meta : {
users : historyUsers ,
start_ts : 1680905536168 ,
end_ts : 1680905536168 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
remove : {
pathname : 'newfolder/tobedeleted.txt' ,
} ,
atV : 7 ,
} ,
] ,
} ,
{
fromV : 6 ,
toV : 7 ,
meta : {
users : historyUsers ,
start_ts : 1680905531816 ,
end_ts : 1680905531816 ,
} ,
labels : [ ] ,
pathnames : [ 'newfolder/tobedeleted.txt' ] ,
project_ops : [ ] ,
} ,
{
fromV : 0 ,
toV : 6 ,
meta : {
users : historyUsers ,
start_ts : 1680905492130 ,
end_ts : 1680905529186 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'tobedeleted.txt' ,
newPathname : 'newfolder/tobedeleted.txt' ,
} ,
atV : 5 ,
} ,
{
add : {
pathname : 'file2.tex' ,
} ,
atV : 4 ,
} ,
{
add : {
pathname : 'newfile.tex' ,
} ,
atV : 3 ,
} ,
{
add : {
pathname : 'tobedeleted.txt' ,
} ,
atV : 2 ,
} ,
{
rename : {
pathname : 'main.tex' ,
newPathname : 'certainly_not_main.tex' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
2023-04-27 14:45:13 -04:00
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-04-27 14:45:13 -04:00
)
2023-04-11 14:08:56 -04:00
2023-04-14 06:57:41 -04:00
expect ( pathname ) . to . equal ( 'certainly_not_main.tex' )
2023-04-11 14:08:56 -04:00
} )
2023-05-16 04:17:57 -04:00
it ( 'selects renamed file' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'main.tex' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-05-16 04:17:57 -04:00
} ,
{
pathname : 'original.bib' ,
newPathname : 'new.bib' ,
operation : 'renamed' ,
2023-05-25 06:20:57 -04:00
editable : true ,
2023-05-16 04:17:57 -04:00
} ,
]
const updates : LoadedUpdate [ ] = [
{
fromV : 4 ,
toV : 7 ,
meta : {
users : historyUsers ,
start_ts : 1680874742389 ,
end_ts : 1680874755552 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
rename : {
pathname : 'original.bib' ,
newPathname : 'new.bib' ,
} ,
atV : 5 ,
} ,
] ,
} ,
{
fromV : 0 ,
toV : 4 ,
meta : {
users : historyUsers ,
start_ts : 1680861975947 ,
end_ts : 1680861988442 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'original.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
const pathname = fileFinalPathname (
2023-05-24 06:02:21 -04:00
autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-05-24 06:02:21 -04:00
)
2023-05-16 04:17:57 -04:00
)
expect ( pathname ) . to . equal ( 'new.bib' )
} )
2023-05-25 06:20:57 -04:00
it ( 'ignores binary file' , function ( ) {
const files : FileDiff [ ] = [
{
pathname : 'frog.jpg' ,
editable : false ,
operation : 'added' ,
} ,
{
pathname : 'main.tex' ,
editable : true ,
} ,
{
pathname : 'sample.bib' ,
editable : true ,
} ,
]
const updates : LoadedUpdate [ ] = [
{
fromV : 4 ,
toV : 7 ,
meta : {
users : historyUsers ,
start_ts : 1680874742389 ,
end_ts : 1680874755552 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'frog.jpg' ,
} ,
atV : 5 ,
} ,
] ,
} ,
{
fromV : 0 ,
toV : 4 ,
meta : {
users : historyUsers ,
start_ts : 1680861975947 ,
end_ts : 1680861988442 ,
} ,
labels : [ ] ,
pathnames : [ ] ,
project_ops : [
{
add : {
pathname : 'sample.bib' ,
} ,
atV : 1 ,
} ,
{
add : {
pathname : 'main.tex' ,
} ,
atV : 0 ,
} ,
] ,
} ,
]
const { pathname } = autoSelectFile (
files ,
updates [ 0 ] . toV ,
comparing ,
2023-05-30 06:15:38 -04:00
getUpdateForVersion ( updates [ 0 ] . toV , updates ) ,
null
2023-05-25 06:20:57 -04:00
)
expect ( pathname ) . to . equal ( 'main.tex' )
} )
2023-04-11 14:08:56 -04:00
} )
} )