mirror of
https://github.com/strapi/strapi.git
synced 2026-05-03 16:22:30 +00:00
243 lines
6.6 KiB
JavaScript
243 lines
6.6 KiB
JavaScript
'use strict';
|
|
|
|
const { createTestBuilder } = require('api-tests/builder');
|
|
const { createStrapiInstance } = require('api-tests/strapi');
|
|
const { createAuthRequest } = require('api-tests/request');
|
|
|
|
const builder = createTestBuilder();
|
|
let strapi;
|
|
let rq;
|
|
let graphqlQuery;
|
|
|
|
const articleModel = {
|
|
attributes: {
|
|
title: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
draftAndPublish: true,
|
|
singularName: 'article',
|
|
pluralName: 'articles',
|
|
displayName: 'Article',
|
|
description: '',
|
|
collectionName: '',
|
|
};
|
|
|
|
const categoryModel = {
|
|
attributes: {
|
|
name: {
|
|
type: 'string',
|
|
},
|
|
articles: {
|
|
type: 'relation',
|
|
relation: 'manyToMany',
|
|
target: 'api::article.article',
|
|
targetAttribute: 'categories',
|
|
},
|
|
},
|
|
draftAndPublish: true,
|
|
singularName: 'category',
|
|
pluralName: 'categories',
|
|
displayName: 'Category',
|
|
description: '',
|
|
collectionName: '',
|
|
};
|
|
|
|
// category-1: has both draft and published versions
|
|
// category-2: draft only (never published)
|
|
const categories = [
|
|
{ name: 'Category 1', documentId: 'category-1', publishedAt: null },
|
|
{ name: 'Category 1', documentId: 'category-1', publishedAt: new Date() },
|
|
{ name: 'Category 2', documentId: 'category-2', publishedAt: null },
|
|
];
|
|
|
|
// article-1: draft only (never published), linked to both categories
|
|
// article-2: has both draft and published versions, linked to both categories
|
|
const articles = ({ category: categoryFixtures }) => {
|
|
const categoryIds = categoryFixtures.map((c) => c.id);
|
|
|
|
return [
|
|
{ title: 'Article 1', documentId: 'article-1', publishedAt: null, categories: categoryIds },
|
|
{ title: 'Article 2', documentId: 'article-2', publishedAt: null, categories: categoryIds },
|
|
{
|
|
title: 'Article 2',
|
|
documentId: 'article-2',
|
|
publishedAt: new Date(),
|
|
categories: categoryIds,
|
|
},
|
|
];
|
|
};
|
|
|
|
describe('Test Graphql hasPublishedVersion filter', () => {
|
|
beforeAll(async () => {
|
|
await builder
|
|
.addContentType(articleModel)
|
|
.addContentType(categoryModel)
|
|
.addFixtures(categoryModel.singularName, categories)
|
|
.addFixtures(articleModel.singularName, articles)
|
|
.build();
|
|
|
|
strapi = await createStrapiInstance();
|
|
rq = await createAuthRequest({ strapi });
|
|
|
|
graphqlQuery = (body) => {
|
|
return rq({
|
|
url: '/graphql',
|
|
method: 'POST',
|
|
body,
|
|
});
|
|
};
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await strapi.destroy();
|
|
await builder.cleanup();
|
|
});
|
|
|
|
test('hasPublishedVersion: false returns only never-published drafts', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles(status: DRAFT, hasPublishedVersion: false) {
|
|
documentId
|
|
title
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles).toHaveLength(1);
|
|
expect(res.body.data.articles[0].documentId).toBe('article-1');
|
|
expect(res.body.data.articles[0].title).toBe('Article 1');
|
|
});
|
|
|
|
test('hasPublishedVersion: true returns only drafts that have a published version', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles(status: DRAFT, hasPublishedVersion: true) {
|
|
documentId
|
|
title
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles).toHaveLength(1);
|
|
expect(res.body.data.articles[0].documentId).toBe('article-2');
|
|
expect(res.body.data.articles[0].title).toBe('Article 2');
|
|
});
|
|
|
|
test('Omitting hasPublishedVersion returns all drafts', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles(status: DRAFT) {
|
|
documentId
|
|
title
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles).toHaveLength(2);
|
|
|
|
const documentIds = res.body.data.articles.map((a) => a.documentId).sort();
|
|
expect(documentIds).toEqual(['article-1', 'article-2']);
|
|
});
|
|
|
|
test('hasPublishedVersion works with _connection query', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles_connection(status: DRAFT, hasPublishedVersion: false) {
|
|
nodes {
|
|
documentId
|
|
title
|
|
}
|
|
pageInfo {
|
|
total
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles_connection.nodes).toHaveLength(1);
|
|
expect(res.body.data.articles_connection.nodes[0].documentId).toBe('article-1');
|
|
expect(res.body.data.articles_connection.pageInfo.total).toBe(1);
|
|
});
|
|
|
|
test('hasPublishedVersion: true cascades into populated relations', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles(status: DRAFT, hasPublishedVersion: true) {
|
|
documentId
|
|
categories {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles).toHaveLength(1);
|
|
expect(res.body.data.articles[0].documentId).toBe('article-2');
|
|
expect(res.body.data.articles[0].categories).toEqual([{ name: 'Category 1' }]);
|
|
});
|
|
|
|
test('hasPublishedVersion: false cascades into populated relations', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles(status: DRAFT, hasPublishedVersion: false) {
|
|
documentId
|
|
categories {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles).toHaveLength(1);
|
|
expect(res.body.data.articles[0].documentId).toBe('article-1');
|
|
expect(res.body.data.articles[0].categories).toEqual([{ name: 'Category 2' }]);
|
|
});
|
|
|
|
test('filters and hasPublishedVersion work together in the same query', async () => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
{
|
|
articles_connection(
|
|
status: DRAFT
|
|
hasPublishedVersion: false
|
|
filters: { title: { eq: "Article 1" } }
|
|
) {
|
|
nodes {
|
|
documentId
|
|
title
|
|
}
|
|
pageInfo {
|
|
total
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body.data.articles_connection.nodes).toHaveLength(1);
|
|
expect(res.body.data.articles_connection.nodes[0].documentId).toBe('article-1');
|
|
expect(res.body.data.articles_connection.nodes[0].title).toBe('Article 1');
|
|
expect(res.body.data.articles_connection.pageInfo.total).toBe(1);
|
|
});
|
|
});
|