chore: merge tests
This commit is contained in:
@@ -1,19 +1,19 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import useField from '../../../../../src/admin/components/forms/useField';
|
import useField from '../../../src/admin/components/forms/useField';
|
||||||
import { textFieldsSlug } from '../../Text';
|
import { collection1Slug } from '../collectionSlugs';
|
||||||
|
|
||||||
export const PrePopulateFieldUI: React.FC<{ path: string, hasMany?: boolean, hasMultipleRelations?: boolean }> = ({ path, hasMany = true, hasMultipleRelations = false }) => {
|
export const PrePopulateFieldUI: React.FC<{ path: string, hasMany?: boolean, hasMultipleRelations?: boolean }> = ({ path, hasMany = true, hasMultipleRelations = false }) => {
|
||||||
const { setValue } = useField({ path });
|
const { setValue } = useField({ path });
|
||||||
|
|
||||||
const addDefaults = React.useCallback(() => {
|
const addDefaults = React.useCallback(() => {
|
||||||
const fetchRelationDocs = async () => {
|
const fetchRelationDocs = async () => {
|
||||||
const res = await fetch(`/api/${textFieldsSlug}?limit=20&where[text][contains]=relationship-test`);
|
const res = await fetch(`/api/${collection1Slug}?limit=20&where[name][contains]=relationship-test`);
|
||||||
const json = await res.json();
|
const json = await res.json();
|
||||||
if (hasMany) {
|
if (hasMany) {
|
||||||
const docIds = json.docs.map((doc) => {
|
const docIds = json.docs.map((doc) => {
|
||||||
if (hasMultipleRelations) {
|
if (hasMultipleRelations) {
|
||||||
return {
|
return {
|
||||||
relationTo: textFieldsSlug,
|
relationTo: collection1Slug,
|
||||||
value: doc.id,
|
value: doc.id,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ export const PrePopulateFieldUI: React.FC<{ path: string, hasMany?: boolean, has
|
|||||||
};
|
};
|
||||||
|
|
||||||
fetchRelationDocs();
|
fetchRelationDocs();
|
||||||
}, [setValue, hasMultipleRelations]);
|
}, [setValue, hasMultipleRelations, hasMany]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
10
test/fields-relationship/collectionSlugs.ts
Normal file
10
test/fields-relationship/collectionSlugs.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
export const slug = 'fields-relationship';
|
||||||
|
|
||||||
|
export const relationOneSlug = 'relation-one';
|
||||||
|
export const relationTwoSlug = 'relation-two';
|
||||||
|
export const relationRestrictedSlug = 'relation-restricted';
|
||||||
|
export const relationWithTitleSlug = 'relation-with-title';
|
||||||
|
export const relationUpdatedExternallySlug = 'relation-updated-externally';
|
||||||
|
export const collection1Slug = 'collection-1';
|
||||||
|
export const collection2Slug = 'collection-2';
|
||||||
@@ -3,13 +3,8 @@ import { buildConfig } from '../buildConfig';
|
|||||||
import { devUser } from '../credentials';
|
import { devUser } from '../credentials';
|
||||||
import { mapAsync } from '../../src/utilities/mapAsync';
|
import { mapAsync } from '../../src/utilities/mapAsync';
|
||||||
import { FilterOptionsProps } from '../../src/fields/config/types';
|
import { FilterOptionsProps } from '../../src/fields/config/types';
|
||||||
|
import { PrePopulateFieldUI } from './PrePopulateFieldUI';
|
||||||
export const slug = 'fields-relationship';
|
import { relationOneSlug, relationTwoSlug, relationRestrictedSlug, relationWithTitleSlug, relationUpdatedExternallySlug, collection1Slug, collection2Slug, slug } from './collectionSlugs';
|
||||||
|
|
||||||
export const relationOneSlug = 'relation-one';
|
|
||||||
export const relationTwoSlug = 'relation-two';
|
|
||||||
export const relationRestrictedSlug = 'relation-restricted';
|
|
||||||
export const relationWithTitleSlug = 'relation-with-title';
|
|
||||||
|
|
||||||
export interface FieldsRelationship {
|
export interface FieldsRelationship {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -93,8 +88,8 @@ export default buildConfig({
|
|||||||
id: {
|
id: {
|
||||||
equals: args.data.relationship,
|
equals: args.data.relationship,
|
||||||
},
|
},
|
||||||
})
|
});
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -123,6 +118,103 @@ export default buildConfig({
|
|||||||
},
|
},
|
||||||
fields: baseRelationshipFields,
|
fields: baseRelationshipFields,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
slug: relationUpdatedExternallySlug,
|
||||||
|
admin: {
|
||||||
|
useAsTitle: 'name',
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
type: 'row',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'relationPrePopulate',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: collection1Slug,
|
||||||
|
admin: {
|
||||||
|
width: '75%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'ui',
|
||||||
|
name: 'prePopulate',
|
||||||
|
admin: {
|
||||||
|
width: '25%',
|
||||||
|
components: {
|
||||||
|
Field: () => PrePopulateFieldUI({ path: 'relationPrePopulate', hasMany: false }),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'row',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'relationHasMany',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: collection1Slug,
|
||||||
|
hasMany: true,
|
||||||
|
admin: {
|
||||||
|
width: '75%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'ui',
|
||||||
|
name: 'prePopulateRelationHasMany',
|
||||||
|
admin: {
|
||||||
|
width: '25%',
|
||||||
|
components: {
|
||||||
|
Field: () => PrePopulateFieldUI({ path: 'relationHasMany', hasMultipleRelations: false }),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'row',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'relationToManyHasMany',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: [collection1Slug, collection2Slug],
|
||||||
|
hasMany: true,
|
||||||
|
admin: {
|
||||||
|
width: '75%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'ui',
|
||||||
|
name: 'prePopulateToMany',
|
||||||
|
admin: {
|
||||||
|
width: '25%',
|
||||||
|
components: {
|
||||||
|
Field: () => PrePopulateFieldUI({ path: 'relationToManyHasMany', hasMultipleRelations: true }),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: collection1Slug,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
name: 'name',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: collection2Slug,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
name: 'name',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
onInit: async (payload) => {
|
onInit: async (payload) => {
|
||||||
await payload.create({
|
await payload.create({
|
||||||
@@ -213,5 +305,20 @@ export default buildConfig({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[...Array(15)].forEach((_, i) => {
|
||||||
|
payload.create({
|
||||||
|
collection: collection1Slug,
|
||||||
|
data: {
|
||||||
|
name: `relationship-test ${i}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
payload.create({
|
||||||
|
collection: collection2Slug,
|
||||||
|
data: {
|
||||||
|
name: `relationship-test ${i}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ import type {
|
|||||||
RelationTwo,
|
RelationTwo,
|
||||||
RelationWithTitle,
|
RelationWithTitle,
|
||||||
} from './config';
|
} from './config';
|
||||||
import { relationOneSlug, relationRestrictedSlug, relationTwoSlug, relationWithTitleSlug, slug } from './config';
|
import { relationOneSlug, relationRestrictedSlug, relationTwoSlug, relationUpdatedExternallySlug, relationWithTitleSlug, slug } from './collectionSlugs';
|
||||||
import wait from '../../src/utilities/wait';
|
import wait from '../../src/utilities/wait';
|
||||||
|
|
||||||
const { beforeAll, beforeEach, describe } = test;
|
const { beforeAll, beforeEach, describe } = test;
|
||||||
|
|
||||||
let url: AdminUrlUtil;
|
|
||||||
|
|
||||||
describe('fields - relationship', () => {
|
describe('fields - relationship', () => {
|
||||||
|
let url: AdminUrlUtil;
|
||||||
let page: Page;
|
let page: Page;
|
||||||
let relationOneDoc: RelationOne;
|
let relationOneDoc: RelationOne;
|
||||||
let anotherRelationOneDoc: RelationOne;
|
let anotherRelationOneDoc: RelationOne;
|
||||||
@@ -28,9 +28,11 @@ describe('fields - relationship', () => {
|
|||||||
let docWithExistingRelations: CollectionWithRelationships;
|
let docWithExistingRelations: CollectionWithRelationships;
|
||||||
let restrictedRelation: RelationRestricted;
|
let restrictedRelation: RelationRestricted;
|
||||||
let relationWithTitle: RelationWithTitle;
|
let relationWithTitle: RelationWithTitle;
|
||||||
|
let serverURL: string;
|
||||||
|
|
||||||
beforeAll(async ({ browser }) => {
|
beforeAll(async ({ browser }) => {
|
||||||
const { serverURL } = await initPayloadE2E(__dirname);
|
const { serverURL: serverURLFromConfig } = await initPayloadE2E(__dirname);
|
||||||
|
serverURL = serverURLFromConfig;
|
||||||
|
|
||||||
url = new AdminUrlUtil(serverURL, slug);
|
url = new AdminUrlUtil(serverURL, slug);
|
||||||
|
|
||||||
@@ -263,6 +265,29 @@ describe('fields - relationship', () => {
|
|||||||
await expect(relationship).toHaveText(relationWithTitle.name);
|
await expect(relationship).toHaveText(relationWithTitle.name);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('externally update field', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
url = new AdminUrlUtil(serverURL, relationUpdatedExternallySlug);
|
||||||
|
await page.goto(url.create);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('has many, one collection', async () => {
|
||||||
|
await page.goto(url.create);
|
||||||
|
|
||||||
|
await page.locator('#field-relationHasMany + .pre-populate-field-ui button').click();
|
||||||
|
await wait(300);
|
||||||
|
|
||||||
|
expect(await page.locator('#field-relationHasMany .rs__value-container > .rs__multi-value').count()).toEqual(15);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('has many, many collections', async () => {
|
||||||
|
await page.locator('#field-relationToManyHasMany + .pre-populate-field-ui button').click();
|
||||||
|
await wait(300);
|
||||||
|
|
||||||
|
expect(await page.locator('#field-relationToManyHasMany .rs__value-container > .rs__multi-value').count()).toEqual(15);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
async function clearAllDocs(): Promise<void> {
|
async function clearAllDocs(): Promise<void> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import type { CollectionConfig } from '../../../../src/collections/config/types';
|
import type { CollectionConfig } from '../../../../src/collections/config/types';
|
||||||
import { PrePopulateFieldUI } from './PrePopulateFieldUI';
|
|
||||||
|
|
||||||
export const relationshipFieldsSlug = 'relationship-fields';
|
export const relationshipFieldsSlug = 'relationship-fields';
|
||||||
|
|
||||||
@@ -17,77 +16,6 @@ const RelationshipFields: CollectionConfig = {
|
|||||||
type: 'relationship',
|
type: 'relationship',
|
||||||
relationTo: relationshipFieldsSlug,
|
relationTo: relationshipFieldsSlug,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
type: 'row',
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: 'relationPrePopulate',
|
|
||||||
type: 'relationship',
|
|
||||||
relationTo: 'text-fields',
|
|
||||||
admin: {
|
|
||||||
width: '75%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'ui',
|
|
||||||
name: 'prePopulate',
|
|
||||||
admin: {
|
|
||||||
width: '25%',
|
|
||||||
components: {
|
|
||||||
Field: () => PrePopulateFieldUI({ path: 'relationPrePopulate', hasMany: false }),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'row',
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: 'relationHasMany',
|
|
||||||
type: 'relationship',
|
|
||||||
relationTo: 'text-fields',
|
|
||||||
hasMany: true,
|
|
||||||
admin: {
|
|
||||||
width: '75%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'ui',
|
|
||||||
name: 'prePopulateRelationHasMany',
|
|
||||||
admin: {
|
|
||||||
width: '25%',
|
|
||||||
components: {
|
|
||||||
Field: () => PrePopulateFieldUI({ path: 'relationHasMany', hasMultipleRelations: false }),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'row',
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: 'relationToManyHasMany',
|
|
||||||
type: 'relationship',
|
|
||||||
relationTo: ['text-fields', 'array-fields'],
|
|
||||||
hasMany: true,
|
|
||||||
admin: {
|
|
||||||
width: '75%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'ui',
|
|
||||||
name: 'prePopulateToMany',
|
|
||||||
admin: {
|
|
||||||
width: '25%',
|
|
||||||
components: {
|
|
||||||
Field: () => PrePopulateFieldUI({ path: 'relationToManyHasMany', hasMultipleRelations: true }),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -78,16 +78,6 @@ export default buildConfig({
|
|||||||
await payload.create({ collection: 'date-fields', data: dateDoc });
|
await payload.create({ collection: 'date-fields', data: dateDoc });
|
||||||
await payload.create({ collection: 'code-fields', data: codeDoc });
|
await payload.create({ collection: 'code-fields', data: codeDoc });
|
||||||
|
|
||||||
[...Array(15)].forEach((_, i) => {
|
|
||||||
payload.create({
|
|
||||||
collection: textFieldsSlug,
|
|
||||||
data: {
|
|
||||||
text: `relationship-test ${i}`,
|
|
||||||
localizedText: `relationship-test ${i}`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const createdTextDoc = await payload.create({ collection: textFieldsSlug, data: textDoc });
|
const createdTextDoc = await payload.create({ collection: textFieldsSlug, data: textDoc });
|
||||||
|
|
||||||
const uploadsDir = path.resolve(__dirname, './collections/Upload/uploads');
|
const uploadsDir = path.resolve(__dirname, './collections/Upload/uploads');
|
||||||
|
|||||||
@@ -415,14 +415,5 @@ describe('fields', () => {
|
|||||||
|
|
||||||
await expect(page.locator('.Toastify')).toContainText('successfully');
|
await expect(page.locator('.Toastify')).toContainText('successfully');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should resolve relationships when added by form context', async () => {
|
|
||||||
await page.goto(url.create);
|
|
||||||
|
|
||||||
await page.locator('#field-relationHasMany + .pre-populate-field-ui button').click();
|
|
||||||
await wait(300);
|
|
||||||
|
|
||||||
expect(await page.locator('#field-relationHasMany .rs__value-container > .rs__multi-value').count()).toEqual(15);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user