@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
295 lines (234 loc) • 14.5 kB
text/typescript
import assert from "assert";
import { genericCreateField, genericCreateList } from "./lists";
import {
AddItem,
GetListItemFieldDisplayValue,
GetListItemFieldValues,
UpdateItem,
RecycleListItem,
DeleteListItem,
GetListItemsByCaml,
GetItemsById,
GetListItemFieldValue,
GetListItemFieldValuesHistory,
AddAttachment,
GetListItemAttachments,
DeleteAttachment,
} from "../../src";
function createCamlQueryById(itemId: number): string {
return `<Where><Eq><FieldRef Name='ID'/><Value Type='Number'>${itemId}</Value></Eq></Where>`;
}
function createCamlQueryByTitle(itemTitle: string): string {
return `<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>${itemTitle}</Value></Eq></Where>`;
}
async function genericCreateItem(siteUrl: string, listId: string, title: string) {
const itemData = { Title: title };
return await AddItem(siteUrl, listId, itemData);
}
describe("List Items", function () {
let listId: string, listTitle: string;
let fieldId: string, fieldTitle: string, fieldInternalName: string;
const columns = ['Title', 'ID', 'Id', 'FileLeafRef', 'FileDirRef', 'FileRef', 'FileSystemObjectType'];
before(async function () {
({ Id: listId, Title: listTitle } = await genericCreateList(this.siteUrl, `TestList_${Date.now()}`));
({ Id: fieldId, Title: fieldTitle, InternalName: fieldInternalName } = await genericCreateField(this.siteUrl, listId, `TestField_${Date.now()}`));
});
describe("AddItem", function () {
let itemId: number, itemTitle: string;
specify("add generic item", async function () {
let success: boolean, errorMessage: string | undefined;
itemTitle = `TestItem_${Date.now()}`;
({ success, errorMessage, itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
assert.ok(success, "'AddItem' should be true");
assert.strictEqual(errorMessage, null, "'errorMessage' should be null");
assert.ok(itemId, "'itemId' should be valid");
});
specify("verify item by Id", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listId, createCamlQueryById(itemId), { columns: columns });
assert.strictEqual(result.length, 1, "GetListItemsByCaml should return one item");
assert.strictEqual(result[0].Id, itemId, "'Id' should match expected id");
assert.strictEqual(result[0].Title, itemTitle, "'Title' should match expected title");
});
specify("verify list by Title", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listTitle, createCamlQueryByTitle(itemTitle), { columns: columns });
assert.strictEqual(result.length, 1, "GetListItemsByCaml should return one item");
assert.strictEqual(result[0].Id, itemId, "'Id' should match expected id");
assert.strictEqual(result[0].Title, itemTitle, "'Title' should match expected title");
});
});
describe("GetItemsById", function () {
let itemId: number, itemTitle: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
specify("get item by Id", async function () {
const result = await GetItemsById(this.siteUrl, listId, [itemId]);
assert.strictEqual(result.filter(x => true).length, 1, "GetItemsById should return one item");
assert.strictEqual(result[itemId].Id, itemId, "'Id' should match expected id");
assert.strictEqual(result[itemId].Title, itemTitle, "'Title' should match expected title");
});
});
describe("GetListItemsByCaml", function () {
let itemId: number, itemTitle: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
specify("get item by Id", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listId, createCamlQueryById(itemId), { columns: columns });
assert.strictEqual(result.length, 1, "GetListItemsByCaml should return one item");
assert.strictEqual(result[0].Id, itemId, "'Id' should match expected id");
assert.strictEqual(result[0].Title, itemTitle, "'Title' should match expected title");
});
specify("get item by Title", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listTitle, createCamlQueryByTitle(itemTitle), { columns: columns });
assert.strictEqual(result.length, 1, "GetListItemsByCaml should return one item");
assert.strictEqual(result[0].Id, itemId, "'Id' should match expected id");
assert.strictEqual(result[0].Title, itemTitle, "'Title' should match expected title");
});
});
describe("DeleteItem by Id", function () {
let itemId: number, itemTitle: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
specify("delete item by Id", async function () {
const { deleted, errorMessage } = await DeleteListItem(this.siteUrl, listId, itemId);
assert.ok(deleted, "'deleted' should be true");
});
specify("verify delete by Id", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listId, createCamlQueryById(itemId), { columns: columns });
assert.strictEqual(result.length, 0, "GetListItemsByCaml should return no items after deletion");
});
specify("verify by Title", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listTitle, createCamlQueryByTitle(itemTitle), { columns: columns });
assert.strictEqual(result.length, 0, "GetListItemsByCaml should return no items after deletion");
});
});
describe("RecycleItem by Id", function () {
let itemId: number, itemTitle: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
specify("recycle item by Id", async function () {
const { recycled, errorMessage } = await RecycleListItem(this.siteUrl, listId, itemId);
assert.ok(recycled, "'recycled' should be true");
assert.strictEqual(errorMessage, undefined, "'errorMessage' should be undefined");
});
specify("verify recycle by Id", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listId, createCamlQueryById(itemId), { columns: columns });
assert.strictEqual(result.length, 0, "GetListItemsByCaml should return no items after recycling");
});
specify("verify recycle by Title", async function () {
const result = await GetListItemsByCaml(this.siteUrl, listTitle, createCamlQueryByTitle(itemTitle), { columns: columns });
assert.strictEqual(result.length, 0, "GetListItemsByCaml should return no items after recycling");
});
});
describe("UpdateItem", function () {
let itemId: number, itemTitle: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
const updatedTitle = `UpdatedTitle_${Date.now()}`;
specify("update Title field value", async function () {
const result = await UpdateItem(this.siteUrl, listId, itemId, { Title: updatedTitle });
assert.strictEqual(result.success, true, "UpdateItem should report success");
assert.strictEqual(result.itemId, itemId, "UpdateItem should return the correct item ID");
});
specify("verify by Id", async function () {
const values = await GetListItemFieldValues(this.siteUrl, listId, itemId, ["Title"]);
assert.strictEqual(values.Title, updatedTitle, "Title should match the updated value");
});
});
describe("GetListItemField...", function () {
let itemId: number, itemTitle: string, itemFieldValue: string;
before(async function () {
itemTitle = `TestItem_${Date.now()}`;
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
itemFieldValue = `TestValue_${Date.now()}`;
await UpdateItem(this.siteUrl, listId, itemId, { [fieldInternalName]: itemFieldValue });
});
describe("GetListItemFieldValue", function () {
specify("get Title field value", async function () {
const value = await GetListItemFieldValue(this.siteUrl, listId, itemId, "Title");
assert.strictEqual(value, itemTitle, "returned value should match title");
});
specify("get custom field value", async function () {
const value = await GetListItemFieldValue(this.siteUrl, listId, itemId, fieldInternalName);
assert.strictEqual(value, itemFieldValue, "returned field value should match custom field value");
});
});
describe("GetListItemFieldValues", function () {
specify("get Title field value and custom field value", async function () {
const values = await GetListItemFieldValues(this.siteUrl, listId, itemId, ["Title", "ID", fieldInternalName]);
assert.ok(values, "should return values");
assert.strictEqual(values.Title, itemTitle, "Title value should be correct");
assert.strictEqual(values.ID, itemId, "ID value should be correct");
assert.strictEqual(values[fieldInternalName], itemFieldValue, "Custom field value should be correct");
});
});
describe("GetListItemFieldDisplayValue", function () {
specify("get Title field display value", async function () {
const value = await GetListItemFieldDisplayValue(this.siteUrl, listId, itemId, "Title");
assert.strictEqual(value, itemTitle, "returned value should match title");
});
specify("get custom field display value", async function () {
const value = await GetListItemFieldDisplayValue(this.siteUrl, listId, itemId, fieldInternalName);
assert.strictEqual(value, itemFieldValue, "returned field value should match custom field value");
});
});
describe("GetListItemFieldDisplayValues", function () {
specify("get Title field display value and custom field display value", async function () {
const values = await GetListItemFieldValues(this.siteUrl, listId, itemId, ["Title", "ID", fieldInternalName]);
assert.ok(values, "should return values");
assert.strictEqual(values.Title, itemTitle, "Title value should be correct");
assert.strictEqual(values.ID, itemId, "ID value should be correct");
assert.strictEqual(values[fieldInternalName], itemFieldValue, "custom field value should be correct");
});
});
describe("GetListItemFieldValueHistory", function () {
specify("get Title field history and custom field history", async function () {
const history = await GetListItemFieldValuesHistory(this.siteUrl, listId, itemId, ["Title", fieldInternalName]);
assert.ok(history, "should return history");
assert.strictEqual(history.length, 2, "should have two versions");
assert.strictEqual(history[1].Title, itemTitle, "first Title is correct");
assert.strictEqual(history[1][fieldInternalName.replace(/_/g, '_x005f_')], null, "first custom field value is null");
assert.strictEqual(history[0].Title, itemTitle, "second Title is correct");
assert.strictEqual(history[0][fieldInternalName.replace(/_/g, '_x005f_')], itemFieldValue, "second custom field value is correct");
});
});
});
describe("Attachments", function () {
let itemId: number;
const itemTitle = `Item_With_Attachments_${Date.now()}`;
const attachmentFileName = "test-attachment.txt";
const attachmentContent = "This is the content of the attachment.";
before(async function () {
({ itemId } = await genericCreateItem(this.siteUrl, listId, itemTitle));
});
specify("AddAttachment should add a file to the list item", async function () {
const result = await AddAttachment(this.siteUrl, listId, itemId, attachmentFileName, attachmentContent as any);
assert.ok(result, "AddAttachment should return a result object");
assert.strictEqual(result.FileName, attachmentFileName, "Attached file name should match");
assert.ok(result.ServerRelativeUrl.endsWith(attachmentFileName), "ServerRelativeUrl should end with the file name");
});
specify("GetListItemAttachments should retrieve the added attachment", async function () {
const attachments = await GetListItemAttachments(this.siteUrl, listId, itemId);
assert.ok(Array.isArray(attachments), "GetListItemAttachments should return an array");
assert.strictEqual(attachments.length, 1, "There should be exactly one attachment");
assert.strictEqual(attachments[0].FileName, attachmentFileName, "The retrieved attachment's FileName should match");
});
specify("DeleteAttachment should remove the file from the list item", async function () {
const result = await DeleteAttachment(this.siteUrl, listId, itemId, attachmentFileName);
assert.ok(result.deleted, "'deleted' should be true");
});
specify("GetListItemAttachments should confirm the attachment is deleted", async function () {
const attachments = await GetListItemAttachments(this.siteUrl, listId, itemId);
assert.strictEqual(attachments.length, 0, "There should be no attachments after deletion");
});
});
});