-
Notifications
You must be signed in to change notification settings - Fork 622
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'dev' into adrian/lifecycle-events-error-logging
- Loading branch information
Showing
12 changed files
with
280 additions
and
53 deletions.
There are no files selected for viewing
206 changes: 206 additions & 0 deletions
206
packages/api-headless-cms/__tests__/contentAPI/references/publishedAndUnpublished.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
import { useCategoryManageHandler } from "../../testHelpers/useCategoryManageHandler"; | ||
import { useArticleManageHandler } from "../../testHelpers/useArticleManageHandler"; | ||
import { useArticleReadHandler } from "../../testHelpers/useArticleReadHandler"; | ||
import { useGraphQLHandler } from "../../testHelpers/useGraphQLHandler"; | ||
import { setupContentModelGroup, setupContentModels } from "../../testHelpers/setup"; | ||
import { GenericRecord } from "@webiny/api/types"; | ||
import slugify from "slugify"; | ||
|
||
interface ICreateCategoryItemPrams { | ||
manager: ReturnType<typeof useCategoryManageHandler>; | ||
publish: boolean; | ||
data: GenericRecord; | ||
} | ||
|
||
const createCategoryItem = async ({ manager, publish, data }: ICreateCategoryItemPrams) => { | ||
const [response] = await manager.createCategory({ data }); | ||
const category = response?.data?.createCategory?.data; | ||
const error = response?.data?.createCategory?.error; | ||
if (!category?.id || error) { | ||
console.log(error.message); | ||
console.log(JSON.stringify(error.data)); | ||
throw new Error("Could not create category."); | ||
} | ||
if (!publish) { | ||
return category; | ||
} | ||
const [publishResponse] = await manager.publishCategory({ | ||
revision: category.id | ||
}); | ||
if (publishResponse?.data?.publishCategory?.error) { | ||
console.log(publishResponse?.data?.publishCategory?.error?.message); | ||
throw new Error("Could not publish category."); | ||
} | ||
return publishResponse.data.publishCategory.data; | ||
}; | ||
|
||
interface ICreateArticleItemPrams { | ||
manager: ReturnType<typeof useArticleManageHandler>; | ||
publish: boolean; | ||
data: GenericRecord; | ||
} | ||
|
||
const createArticleItem = async ({ manager, publish, data }: ICreateArticleItemPrams) => { | ||
const [response] = await manager.createArticle({ data }); | ||
const article = response?.data?.createArticle?.data; | ||
const error = response?.data?.createArticle?.error; | ||
if (!article?.id || error) { | ||
console.log(error.message); | ||
console.log(JSON.stringify(error.data)); | ||
throw new Error("Could not create article."); | ||
} | ||
if (!publish) { | ||
return article; | ||
} | ||
const [publishResponse] = await manager.publishArticle({ | ||
revision: article.id | ||
}); | ||
if (publishResponse?.data?.publishArticle?.error) { | ||
console.log(publishResponse?.data?.publishArticle?.error?.message); | ||
throw new Error("Could not publish article."); | ||
} | ||
return publishResponse.data.publishArticle.data; | ||
}; | ||
|
||
interface ICategoryItem { | ||
id: string; | ||
entryId: string; | ||
title: string; | ||
slug: string; | ||
published: boolean; | ||
} | ||
|
||
const categoryNames = ["Tech", "Health", "Space", "Food", "Science", "Sports"]; | ||
|
||
describe("published and unpublished references", () => { | ||
const manageOpts = { path: "manage/en-US" }; | ||
const readOpts = { path: "read/en-US" }; | ||
|
||
const mainManager = useGraphQLHandler(manageOpts); | ||
|
||
it("should populate reference field with some published and some unpublished records", async () => { | ||
const group = await setupContentModelGroup(mainManager); | ||
await setupContentModels(mainManager, group, ["category", "article"]); | ||
|
||
const categoryManager = useCategoryManageHandler(manageOpts); | ||
const articleManager = useArticleManageHandler(manageOpts); | ||
const articleRead = useArticleReadHandler(readOpts); | ||
|
||
const categories: ICategoryItem[] = []; | ||
|
||
for (const index in categoryNames) { | ||
const title = categoryNames[index]; | ||
const published = Number(index) % 2 === 0; | ||
const category = await createCategoryItem({ | ||
manager: categoryManager, | ||
data: { | ||
title: title, | ||
slug: slugify(title) | ||
}, | ||
publish: published | ||
}); | ||
categories.push({ | ||
...category, | ||
published | ||
}); | ||
} | ||
expect(categories.length).toBe(categoryNames.length); | ||
|
||
const firstUnpublishedCategoryId = categories.find(c => !c.published)!.id; | ||
expect(firstUnpublishedCategoryId).toMatch(/^([a-zA-Z0-9]+)#0001$/); | ||
/** | ||
* Create an article and make sure all the categories are in it. | ||
*/ | ||
const createdArticle = await createArticleItem({ | ||
manager: articleManager, | ||
data: { | ||
title: "Tech article", | ||
body: null, | ||
category: { | ||
id: firstUnpublishedCategoryId, | ||
modelId: "category" | ||
}, | ||
categories: categories.map(c => { | ||
return { | ||
id: c.id, | ||
modelId: "category" | ||
}; | ||
}) | ||
}, | ||
publish: false | ||
}); | ||
|
||
const expectedAllCategories = categories.map(c => { | ||
return { | ||
id: c.id, | ||
entryId: c.entryId, | ||
modelId: "category" | ||
}; | ||
}); | ||
const expectedPublishedCategories = categories | ||
.filter(c => c.published) | ||
.map(c => { | ||
return { | ||
id: c.id, | ||
entryId: c.entryId, | ||
modelId: "category" | ||
}; | ||
}); | ||
expect(expectedAllCategories).toHaveLength(expectedPublishedCategories.length * 2); | ||
|
||
expect(createdArticle.categories).toEqual(expectedAllCategories); | ||
|
||
const [articleManageGetResponse] = await articleManager.getArticle({ | ||
revision: createdArticle.id | ||
}); | ||
expect(articleManageGetResponse?.data?.getArticle?.data?.categories).toEqual( | ||
expectedAllCategories | ||
); | ||
expect(articleManageGetResponse?.data?.getArticle?.data?.category).toMatchObject({ | ||
id: firstUnpublishedCategoryId | ||
}); | ||
/** | ||
* Now we can publish the article and check that references are still there. | ||
*/ | ||
const [publishResponse] = await articleManager.publishArticle({ | ||
revision: createdArticle.id | ||
}); | ||
expect(publishResponse?.data?.publishArticle?.data?.categories).toEqual( | ||
expectedAllCategories | ||
); | ||
expect(publishResponse?.data?.publishArticle?.data?.category).toMatchObject({ | ||
id: firstUnpublishedCategoryId | ||
}); | ||
/** | ||
* Now we can read the article, from manage endpoint, and check that references are still there. | ||
* | ||
* There must be all the categories present. | ||
*/ | ||
const [articleManageGetPublishedResponse] = await articleManager.getArticle({ | ||
revision: createdArticle.id | ||
}); | ||
expect(articleManageGetPublishedResponse?.data?.getArticle?.data?.categories).toEqual( | ||
expectedAllCategories | ||
); | ||
expect(articleManageGetPublishedResponse?.data?.getArticle?.data?.category).toMatchObject({ | ||
id: firstUnpublishedCategoryId | ||
}); | ||
/** | ||
* And read from the read endpoint... | ||
* | ||
* There must be only published categories present. | ||
*/ | ||
const [articleReadGetPublishedResponse] = await articleRead.getArticle({ | ||
where: { | ||
id: createdArticle.id | ||
} | ||
}); | ||
expect(articleReadGetPublishedResponse?.data?.getArticle?.data?.categories).toMatchObject( | ||
expectedPublishedCategories | ||
); | ||
expect(articleReadGetPublishedResponse?.data?.getArticle?.data?.categories).toHaveLength( | ||
expectedPublishedCategories.length | ||
); | ||
expect(articleReadGetPublishedResponse?.data?.getArticle?.data?.category).toBeNull(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 34 additions & 0 deletions
34
packages/api-headless-cms/__tests__/storageOperations/context.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import dbPlugins from "@webiny/handler-db"; | ||
import { PluginsContainer } from "@webiny/plugins"; | ||
import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; | ||
import { DynamoDbDriver } from "@webiny/db-dynamodb"; | ||
import { CmsContext } from "~/types"; | ||
import { Context } from "@webiny/api"; | ||
|
||
export interface ICreateStorageOperationsContextParams { | ||
plugins?: PluginsContainer; | ||
} | ||
|
||
export const createStorageOperationsContext = async ( | ||
params: ICreateStorageOperationsContextParams | ||
): Promise<CmsContext> => { | ||
const dbPluginsInitialized = dbPlugins({ | ||
table: process.env.DB_TABLE, | ||
driver: new DynamoDbDriver({ | ||
documentClient: getDocumentClient() | ||
}) | ||
}); | ||
const plugins = params.plugins || new PluginsContainer([]); | ||
plugins.register(...dbPluginsInitialized); | ||
|
||
const context = new Context({ | ||
plugins, | ||
WEBINY_VERSION: "0.0.0" | ||
}) as unknown as CmsContext; | ||
|
||
for (const db of dbPluginsInitialized) { | ||
await db.apply(context); | ||
} | ||
|
||
return context; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.