feat: unify cloud workspace and release desktop v0.1.38
This commit is contained in:
@@ -181,6 +181,8 @@ async function run() {
|
||||
let shareId = null;
|
||||
let shareCode = '';
|
||||
let directLinkId = null;
|
||||
let directLinkCode = '';
|
||||
let artifactDirName = AUDIT_PREFIX;
|
||||
|
||||
test('public health/config/csrf endpoints are reachable', async () => {
|
||||
const health = await request(baseUrl, jar, 'GET', '/api/health');
|
||||
@@ -288,12 +290,30 @@ async function run() {
|
||||
assert.strictEqual(check.data.success, true);
|
||||
|
||||
const url = await request(baseUrl, jar, 'GET', `/api/files/download-url?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt&mode=download`);
|
||||
assert.strictEqual(url.status, 400);
|
||||
assert.match(url.data.message, /OSS/);
|
||||
assert.strictEqual(url.status, 200);
|
||||
assert.strictEqual(url.data.storageType, 'local');
|
||||
assert.match(url.data.downloadUrl, /\/api\/files\/download/);
|
||||
|
||||
const download = await request(baseUrl, jar, 'GET', `/api/files/download?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt`);
|
||||
const tokenDownload = await request(baseUrl, null, 'GET', url.data.downloadUrl);
|
||||
assert.strictEqual(tokenDownload.status, 200);
|
||||
assert.ok(tokenDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
|
||||
|
||||
const legacyDownload = await request(baseUrl, jar, 'GET', `/api/files/download?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt`);
|
||||
assert.strictEqual(legacyDownload.status, 302);
|
||||
const legacyLocation = legacyDownload.headers.get('location') || '';
|
||||
assert.match(legacyLocation, /\/api\/files\/download\?.*token=/);
|
||||
|
||||
const download = await request(baseUrl, null, 'GET', legacyLocation);
|
||||
assert.strictEqual(download.status, 200);
|
||||
assert.ok(download.raw.toString('utf8').includes(AUDIT_PREFIX));
|
||||
|
||||
const partialUrl = new URL(url.data.downloadUrl);
|
||||
const partial = await request(baseUrl, null, 'GET', partialUrl.toString(), {
|
||||
headers: { Range: 'bytes=6-' }
|
||||
});
|
||||
assert.strictEqual(partial.status, 206);
|
||||
assert.match(partial.headers.get('content-range') || '', /^bytes 6-/);
|
||||
assert.strictEqual(partial.raw.toString('utf8'), download.raw.subarray(6).toString('utf8'));
|
||||
});
|
||||
|
||||
test('share and direct-link flows preserve path boundaries', async () => {
|
||||
@@ -337,6 +357,29 @@ async function run() {
|
||||
});
|
||||
assert.ok([400, 403, 404].includes(traversal.status));
|
||||
|
||||
const shareUrl = await request(baseUrl, publicJar, 'POST', `/api/share/${shareCode}/download-url`, {
|
||||
json: {
|
||||
path: `/${AUDIT_PREFIX}/hello.txt`,
|
||||
mode: 'download',
|
||||
password: `${AUDIT_PREFIX}_pw`
|
||||
}
|
||||
});
|
||||
assert.strictEqual(shareUrl.status, 200);
|
||||
assert.match(shareUrl.data.downloadUrl, /\/api\/share\/[^/]+\/download-file\?.*token=/);
|
||||
|
||||
const shareDownload = await request(baseUrl, null, 'GET', shareUrl.data.downloadUrl);
|
||||
assert.strictEqual(shareDownload.status, 200);
|
||||
assert.ok(shareDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
|
||||
|
||||
const sharePartial = await request(baseUrl, null, 'GET', shareUrl.data.downloadUrl, {
|
||||
headers: { Range: 'bytes=6-' }
|
||||
});
|
||||
assert.strictEqual(sharePartial.status, 206);
|
||||
assert.strictEqual(
|
||||
sharePartial.raw.toString('utf8'),
|
||||
shareDownload.raw.subarray(6).toString('utf8')
|
||||
);
|
||||
|
||||
const direct = await request(baseUrl, jar, 'POST', '/api/direct-link/create', {
|
||||
json: {
|
||||
file_path: `/${AUDIT_PREFIX}/hello.txt`,
|
||||
@@ -347,6 +390,32 @@ async function run() {
|
||||
assert.strictEqual(direct.status, 200);
|
||||
assert.strictEqual(direct.data.success, true);
|
||||
directLinkId = direct.data.link_id;
|
||||
directLinkCode = direct.data.link_code;
|
||||
});
|
||||
|
||||
test('renaming a directory preserves shares and direct links', async () => {
|
||||
const renamedDir = `${AUDIT_PREFIX}_renamed`;
|
||||
const rename = await request(baseUrl, jar, 'POST', '/api/files/rename', {
|
||||
json: { path: '/', oldName: AUDIT_PREFIX, newName: renamedDir }
|
||||
});
|
||||
assert.strictEqual(rename.status, 200);
|
||||
assert.strictEqual(rename.data.success, true);
|
||||
artifactDirName = renamedDir;
|
||||
|
||||
const shares = await request(baseUrl, jar, 'GET', '/api/share/my');
|
||||
const share = shares.data.shares.find(item => item.share_code === shareCode);
|
||||
assert.strictEqual(share.share_path, `/${renamedDir}`);
|
||||
|
||||
const publicJar = new CookieJar();
|
||||
const list = await request(baseUrl, publicJar, 'POST', `/api/share/${shareCode}/list`, {
|
||||
json: { path: '', password: `${AUDIT_PREFIX}_pw` }
|
||||
});
|
||||
assert.strictEqual(list.status, 200);
|
||||
assert.ok(list.data.items.some(item => item.name === 'hello.txt'));
|
||||
|
||||
const directDownload = await request(baseUrl, null, 'GET', `/d/${directLinkCode}`);
|
||||
assert.strictEqual(directDownload.status, 200);
|
||||
assert.ok(directDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
|
||||
});
|
||||
|
||||
test('admin listing/logging endpoints are authenticated and sanitized', async () => {
|
||||
@@ -376,7 +445,7 @@ async function run() {
|
||||
assert.ok([200, 404].includes(res.status));
|
||||
}
|
||||
const del = await request(baseUrl, jar, 'POST', '/api/files/delete', {
|
||||
json: { path: '/', fileName: AUDIT_PREFIX }
|
||||
json: { path: '/', fileName: artifactDirName }
|
||||
});
|
||||
assert.strictEqual(del.status, 200);
|
||||
assert.strictEqual(del.data.success, true);
|
||||
|
||||
Reference in New Issue
Block a user