85 lines
2.5 KiB
TypeScript
85 lines
2.5 KiB
TypeScript
|
|
import test from 'node:test';
|
||
|
|
import assert from 'node:assert/strict';
|
||
|
|
|
||
|
|
import type { SftpFileEntry } from '../../types.ts';
|
||
|
|
import { sortSftpEntries } from './utils.ts';
|
||
|
|
|
||
|
|
const entry = (
|
||
|
|
name: string,
|
||
|
|
type: SftpFileEntry['type'],
|
||
|
|
lastModified: number,
|
||
|
|
): SftpFileEntry => ({
|
||
|
|
name,
|
||
|
|
type,
|
||
|
|
size: 0,
|
||
|
|
sizeFormatted: '0 B',
|
||
|
|
lastModified,
|
||
|
|
lastModifiedFormatted: String(lastModified),
|
||
|
|
});
|
||
|
|
|
||
|
|
const entries = [
|
||
|
|
entry('dir-a', 'directory', 100),
|
||
|
|
entry('newest.log', 'file', 300),
|
||
|
|
entry('dir-b', 'directory', 200),
|
||
|
|
];
|
||
|
|
|
||
|
|
test('SFTP sorting keeps directories first by default', () => {
|
||
|
|
const sorted = sortSftpEntries(entries, 'modified', 'desc');
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['dir-b', 'dir-a', 'newest.log']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('SFTP sorting can mix files and directories in the selected order', () => {
|
||
|
|
const sorted = sortSftpEntries(entries, 'modified', 'desc', false);
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['newest.log', 'dir-b', 'dir-a']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('SFTP kind sorting keeps directories first when enabled', () => {
|
||
|
|
const kindEntries = [
|
||
|
|
entry('BUILD', 'file', 100),
|
||
|
|
entry('src', 'directory', 100),
|
||
|
|
entry('archive.zip', 'file', 100),
|
||
|
|
];
|
||
|
|
|
||
|
|
const sorted = sortSftpEntries(kindEntries, 'type', 'asc', true);
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['src', 'BUILD', 'archive.zip']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('SFTP descending kind sorting keeps directories first when enabled', () => {
|
||
|
|
const kindEntries = [
|
||
|
|
entry('BUILD', 'file', 100),
|
||
|
|
entry('src', 'directory', 100),
|
||
|
|
entry('archive.zip', 'file', 100),
|
||
|
|
];
|
||
|
|
|
||
|
|
const sorted = sortSftpEntries(kindEntries, 'type', 'desc', true);
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['src', 'archive.zip', 'BUILD']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('SFTP owner sorting compares usernames and keeps directories first', () => {
|
||
|
|
const ownerEntries = [
|
||
|
|
{ ...entry('www.log', 'file', 100), owner: 'www-data' },
|
||
|
|
{ ...entry('root.txt', 'file', 100), owner: 'root' },
|
||
|
|
{ ...entry('home', 'directory', 100), owner: 'alice' },
|
||
|
|
];
|
||
|
|
|
||
|
|
const sorted = sortSftpEntries(ownerEntries, 'owner', 'asc', true);
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['home', 'root.txt', 'www.log']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('SFTP kind sorting can mix files and directories when folders first is disabled', () => {
|
||
|
|
const kindEntries = [
|
||
|
|
entry('BUILD', 'file', 100),
|
||
|
|
entry('src', 'directory', 100),
|
||
|
|
entry('archive.zip', 'file', 100),
|
||
|
|
];
|
||
|
|
|
||
|
|
const sorted = sortSftpEntries(kindEntries, 'type', 'asc', false);
|
||
|
|
|
||
|
|
assert.deepEqual(sorted.map(({ name }) => name), ['BUILD', 'src', 'archive.zip']);
|
||
|
|
});
|