mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
380 lines
11 KiB
TypeScript
380 lines
11 KiB
TypeScript
import { faker } from "@faker-js/faker";
|
|
import {
|
|
buildCollection,
|
|
buildDocument,
|
|
buildShare,
|
|
buildTeam,
|
|
buildUser,
|
|
} from "@server/test/factories";
|
|
import { loadPublicShare, loadShareWithParent } from "./shareLoader";
|
|
|
|
describe("shareLoader", () => {
|
|
describe("collection share", () => {
|
|
it("should return share with tree and collection when requested with id", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const childDocument = await buildDocument({
|
|
parentDocumentId: document.id,
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
collectionId: collection.id,
|
|
});
|
|
|
|
const result = await loadPublicShare({
|
|
id: share.id,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.collection?.id).toEqual(collection.id);
|
|
expect(result.sharedTree?.id).toEqual(collection.id);
|
|
expect(result.sharedTree?.url).toEqual(collection.path);
|
|
expect(result.sharedTree?.children[0].id).toEqual(document.id);
|
|
expect(result.sharedTree?.children[0].children[0].id).toEqual(
|
|
childDocument.id
|
|
);
|
|
expect(result.document).toBeNull();
|
|
});
|
|
|
|
it("should return correct path for root node in sharedTree for domain", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
await buildDocument({
|
|
parentDocumentId: document.id,
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
collectionId: collection.id,
|
|
domain: faker.internet.domainName(),
|
|
});
|
|
|
|
const result = await loadPublicShare({
|
|
id: share.id,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.collection?.id).toEqual(collection.id);
|
|
expect(result.sharedTree?.id).toEqual(collection.id);
|
|
expect(result.sharedTree?.url).toEqual("");
|
|
});
|
|
|
|
it("should return only share when requested with collectionId", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
collectionId: collection.id,
|
|
});
|
|
|
|
const result = await loadShareWithParent({
|
|
collectionId: collection.id,
|
|
user,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.parentShare).toBeNull();
|
|
});
|
|
|
|
it("should throw error when the requested collection is not part of the share", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const anotherCollection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
collectionId: collection.id,
|
|
});
|
|
|
|
await expect(
|
|
loadPublicShare({ id: share.id, collectionId: anotherCollection.id })
|
|
).rejects.toThrow();
|
|
});
|
|
});
|
|
|
|
describe("document share", () => {
|
|
it("should return share with tree and document when requested with id", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const childDocument = await buildDocument({
|
|
parentDocumentId: document.id,
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
includeChildDocuments: true,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
});
|
|
|
|
const result = await loadPublicShare({
|
|
id: share.id,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.document?.id).toEqual(document.id);
|
|
expect(result.sharedTree?.id).toEqual(document.id);
|
|
expect(result.sharedTree?.children.length).toEqual(1);
|
|
expect(result.sharedTree?.children[0].id).toEqual(childDocument.id);
|
|
expect(result.collection).toBeNull();
|
|
});
|
|
|
|
it("should not return share tree when includeChildDocuments is false", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
await buildDocument({
|
|
parentDocumentId: document.id,
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
includeChildDocuments: false,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
});
|
|
|
|
const result = await loadPublicShare({
|
|
id: share.id,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.document?.id).toEqual(document.id);
|
|
expect(result.sharedTree).toBeNull();
|
|
expect(result.collection).toBeNull();
|
|
});
|
|
|
|
it("should return share and parentShare when requested with documentId", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const childDocument = await buildDocument({
|
|
parentDocumentId: document.id,
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const [parentShare, share] = await Promise.all([
|
|
buildShare({
|
|
includeChildDocuments: true,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
}),
|
|
buildShare({
|
|
includeChildDocuments: false,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: childDocument.id,
|
|
}),
|
|
]);
|
|
|
|
const result = await loadShareWithParent({
|
|
documentId: childDocument.id,
|
|
user,
|
|
});
|
|
|
|
expect(result.share.id).toEqual(share.id);
|
|
expect(result.parentShare?.id).toEqual(parentShare.id);
|
|
});
|
|
|
|
it("should throw error when the requested document is not part of the share (includeChildDocuments = true)", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const anotherDocument = await buildDocument({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
includeChildDocuments: true,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
});
|
|
|
|
await expect(
|
|
loadPublicShare({ id: share.id, documentId: anotherDocument.id })
|
|
).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when the requested document is not part of the share (includeChildDocuments = false)", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const anotherDocument = await buildDocument({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
includeChildDocuments: false,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
});
|
|
|
|
await expect(
|
|
loadPublicShare({ id: share.id, documentId: anotherDocument.id })
|
|
).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when the child document is requested for a share with includeChildDocuments = false", async () => {
|
|
const user = await buildUser();
|
|
const collection = await buildCollection({
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const document = await buildDocument({
|
|
collectionId: collection.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const childDocument = await buildDocument({
|
|
parentDocumentId: document.id,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
const share = await buildShare({
|
|
includeChildDocuments: false,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
documentId: document.id,
|
|
});
|
|
|
|
await expect(
|
|
loadPublicShare({ id: share.id, documentId: childDocument.id })
|
|
).rejects.toThrow();
|
|
});
|
|
});
|
|
|
|
describe("inactive share when requested with id", () => {
|
|
it("should throw error when share is not published", async () => {
|
|
const share = await buildShare({
|
|
published: false,
|
|
});
|
|
|
|
await expect(loadPublicShare({ id: share.id })).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when team has disabled sharing", async () => {
|
|
const team = await buildTeam({
|
|
sharing: false,
|
|
});
|
|
const share = await buildShare({
|
|
teamId: team.id,
|
|
});
|
|
|
|
await expect(loadPublicShare({ id: share.id })).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when collection has disabled sharing", async () => {
|
|
const collection = await buildCollection({
|
|
sharing: false,
|
|
});
|
|
const share = await buildShare({
|
|
collectionId: collection.id,
|
|
teamId: collection.teamId,
|
|
});
|
|
|
|
await expect(loadPublicShare({ id: share.id })).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when collection is archived", async () => {
|
|
const collection = await buildCollection({
|
|
archivedAt: new Date(),
|
|
});
|
|
const share = await buildShare({
|
|
collectionId: collection.id,
|
|
teamId: collection.teamId,
|
|
});
|
|
|
|
await expect(loadPublicShare({ id: share.id })).rejects.toThrow();
|
|
});
|
|
|
|
it("should throw error when document is archived", async () => {
|
|
const document = await buildDocument({
|
|
archivedAt: new Date(),
|
|
});
|
|
const share = await buildShare({
|
|
documentId: document.id,
|
|
teamId: document.teamId,
|
|
});
|
|
|
|
await expect(loadPublicShare({ id: share.id })).rejects.toThrow();
|
|
});
|
|
});
|
|
});
|