@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
258 lines (214 loc) • 11 kB
text/typescript
import assert from "assert";
import {
BaseTypes,
CreateList,
ListTemplateTypes,
UploadFile,
GetFile,
GetFileEx,
MoveFile,
CopyFile,
DeleteFile,
RecycleFile,
EnsureFolder,
EnsureFolderPath,
GetFolderFiles,
DeleteFolder,
GetListRootFolder
} from "../../src";
async function genericCreateDocLib(siteUrl: string, title: string) {
const info = {
title,
description: "test document library",
type: BaseTypes.DocumentLibrary,
template: ListTemplateTypes.DocumentLibrary,
};
return await CreateList(siteUrl, info);
}
describe("Files and Folders", function () {
let listId: string;
let rootFolderUrl: string;
before(async function () {
({ Id: listId } = await genericCreateDocLib(this.siteUrl, `TestDocLib_${Date.now()}`));
assert.ok(listId, "List ID should be defined after creating the document library");
({ ServerRelativeUrl: rootFolderUrl } = await GetListRootFolder(this.siteUrl, listId));
assert.ok(rootFolderUrl, "Root folder URL should be defined");
});
describe("UploadFile", function () {
const fileName = `upload-test-${Date.now()}.txt`;
const fileContent = 'This is content for UploadFile test.';
let fileUrl: string;
specify("uploads a new file", async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, fileName, fileContent as any);
assert.ok(uploadResult.Exists, "UploadFile should return Exists: true");
assert.ok(uploadResult.ServerRelativeUrl, "UploadFile should return a ServerRelativeUrl");
fileUrl = uploadResult.ServerRelativeUrl;
});
specify("verifies the uploaded file can be retrieved", async function () {
const file = await GetFile<string>(this.siteUrl, fileUrl);
assert.strictEqual(file.Content, fileContent, "File content should match the uploaded content");
});
});
describe("GetFile", function () {
const fileName = `getfile-test-${Date.now()}.txt`;
const fileContent = 'getfile content';
let fileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, fileName, fileContent as any);
fileUrl = uploadResult.ServerRelativeUrl!;
});
specify("gets an existing file's content and metadata", async function () {
const fileResult = await GetFile<string>(this.siteUrl, fileUrl);
assert.ok(fileResult.Exists, "File should exist");
assert.strictEqual(fileResult.Content, fileContent, "File content should match");
});
});
describe("GetFileEx", function () {
const fileName = `getfileex-test-${Date.now()}.txt`;
const fileContent = 'getfileex content';
let fileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, fileName, fileContent as any);
fileUrl = uploadResult.ServerRelativeUrl!;
});
specify("gets an existing file's content and metadata using extended options", async function () {
const fileExResult = await GetFileEx<string>(this.siteUrl, fileUrl);
assert.ok(fileExResult.Exists, "File should exist");
assert.strictEqual(fileExResult.Content, fileContent, "File content should match");
});
});
describe("CopyFile", function () {
const sourceFileName = `copy-source-${Date.now()}.txt`;
const targetFileName = `copy-target-${Date.now()}.txt`;
let sourceFileUrl: string;
let targetFileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, sourceFileName, "copy content" as any);
sourceFileUrl = uploadResult.ServerRelativeUrl!;
targetFileUrl = `${rootFolderUrl}/${targetFileName}`;
});
specify("copies a file to a new destination", async function () {
const success = await CopyFile(this.siteUrl, sourceFileUrl, targetFileUrl);
assert.ok(success, "CopyFile should return true on success");
});
specify("verifies both source and target files exist after copy", async function () {
const sourceFile = await GetFile(this.siteUrl, sourceFileUrl);
const targetFile = await GetFile(this.siteUrl, targetFileUrl);
assert.ok(sourceFile.Exists, "Source file should still exist after copy");
assert.ok(targetFile.Exists, "Target file should exist after copy");
});
});
describe("MoveFile", function () {
const sourceFileName = `move-source-${Date.now()}.txt`;
const targetFileName = `move-target-${Date.now()}.txt`;
let sourceFileUrl: string;
let targetFileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, sourceFileName, "move content" as any);
sourceFileUrl = uploadResult.ServerRelativeUrl!;
targetFileUrl = `${rootFolderUrl}/${targetFileName}`;
});
specify("moves a file to a new destination", async function () {
const success = await MoveFile(this.siteUrl, sourceFileUrl, targetFileUrl);
assert.ok(success, "MoveFile should return true on success");
});
specify("verifies source is removed and target exists after move", async function () {
const sourceFile = await GetFile(this.siteUrl, sourceFileUrl);
const targetFile = await GetFile(this.siteUrl, targetFileUrl);
assert.strictEqual(sourceFile.Exists, false, "Source file should not exist after move");
assert.ok(targetFile.Exists, "Target file should exist after move");
});
});
describe("RecycleFile", function () {
const fileName = `recycle-test-${Date.now()}.txt`;
let fileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, fileName, "recycle me" as any);
fileUrl = uploadResult.ServerRelativeUrl!;
});
specify("recycles an existing file", async function () {
const recycled = await RecycleFile(this.siteUrl, fileUrl);
assert.ok(recycled, "RecycleFile should return true");
});
specify("verifies the file is gone after recycling", async function () {
const fileResult = await GetFile(this.siteUrl, fileUrl);
assert.strictEqual(fileResult.Exists, false, "File should not exist after being recycled");
});
});
describe("DeleteFile", function () {
const fileName = `delete-test-${Date.now()}.txt`;
let fileUrl: string;
before(async function () {
const uploadResult = await UploadFile(this.siteUrl, rootFolderUrl, fileName, "delete me" as any);
fileUrl = uploadResult.ServerRelativeUrl!;
});
specify("deletes an existing file", async function () {
const deleted = await DeleteFile(this.siteUrl, fileUrl);
assert.ok(deleted, "DeleteFile should return true");
});
specify("verifies the file is gone after deletion", async function () {
const fileResult = await GetFile(this.siteUrl, fileUrl);
assert.strictEqual(fileResult.Exists, false, "File should not exist after permanent deletion");
});
});
describe("EnsureFolder", function () {
const folderName = `ensure-folder-${Date.now()}`;
let folderUrl: string;
specify("ensures a new folder is created", async function () {
const result = await EnsureFolder(this.siteUrl, rootFolderUrl, folderName);
assert.ok(result.Exists, "EnsureFolder should confirm the folder exists");
assert.ok(result.ServerRelativeUrl, "EnsureFolder should return a ServerRelativeUrl");
assert.ok(result.ServerRelativeUrl.endsWith(folderName), "ServerRelativeUrl should be correct");
folderUrl = result.ServerRelativeUrl;
});
specify("verifies the folder exists by getting its content", async function () {
const files = await GetFolderFiles(this.siteUrl, folderUrl);
assert.ok(Array.isArray(files), "GetFolderFiles should return an array for an existing folder");
});
});
describe("GetFolderFiles", function () {
const folderName = `getfiles-folder-${Date.now()}`;
const fileName = 'file-in-folder.txt';
let folderUrl: string;
before(async function () {
const folder = await EnsureFolder(this.siteUrl, rootFolderUrl, folderName);
folderUrl = folder.ServerRelativeUrl!;
await UploadFile(this.siteUrl, folderUrl, fileName, "content" as any);
});
specify("gets files from a non-empty folder", async function () {
const files = await GetFolderFiles(this.siteUrl, folderUrl);
assert.strictEqual(files.length, 1, "Folder should contain exactly one file");
assert.strictEqual(files[0].Name, fileName, "The name of the file in the folder should match");
});
});
describe("DeleteFolder", function () {
const folderName = `delete-folder-${Date.now()}`;
let folderUrl: string;
before(async function () {
const folder = await EnsureFolder(this.siteUrl, rootFolderUrl, folderName);
folderUrl = folder.ServerRelativeUrl!;
});
specify("deletes an existing folder", async function () {
const success = await DeleteFolder(this.siteUrl, folderUrl);
assert.ok(success, "DeleteFolder should return true for success");
});
specify("verifies the folder is gone", async function () {
const files = await GetFolderFiles(this.siteUrl, folderUrl);
assert.strictEqual(files.length, 0, "Getting files from a deleted folder should return an empty array");
});
});
describe("EnsureFolderPath", function () {
let deepFolderPath: string;
before(function () {
deepFolderPath = `${rootFolderUrl}/L1/L2/L3_${Date.now()}`;
});
specify("creates a nested folder structure", async function () {
const success = await EnsureFolderPath(this.siteUrl, deepFolderPath);
assert.ok(success, "EnsureFolderPath should return true upon successful creation");
});
specify("verifies the nested folder exists", async function () {
const files = await GetFolderFiles(this.siteUrl, deepFolderPath);
assert.ok(Array.isArray(files), "Should be able to get files from the newly created nested folder");
});
});
});