Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
373 lines
12 KiB
Plaintext
373 lines
12 KiB
Plaintext
import { describe, it, expect } from 'vitest';
|
|
import { normalizeRelationshipValue } from './normalizeRelationshipValue.js';
|
|
describe('normalizeRelationshipValue', () => {
|
|
describe('Monomorphic relationships (string relationTo)', () => {
|
|
const relationTo = 'users';
|
|
it('should return simple string ID as-is', () => {
|
|
const result = normalizeRelationshipValue('user123', relationTo);
|
|
expect(result).toBe('user123');
|
|
});
|
|
it('should return simple number ID as-is', () => {
|
|
const result = normalizeRelationshipValue(123, relationTo);
|
|
expect(result).toBe(123);
|
|
});
|
|
it('should extract ID from object with relationTo and value', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: 'user456'
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('user456');
|
|
});
|
|
it('should extract ID from nested value structure', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: {
|
|
value: 'user789'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('user789');
|
|
});
|
|
it('should extract ID from deeply nested value structure', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: {
|
|
value: {
|
|
value: 'user999'
|
|
}
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('user999');
|
|
});
|
|
it('should extract ID from populated document', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: {
|
|
id: 'user111',
|
|
name: 'John Doe',
|
|
email: 'john@example.com'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('user111');
|
|
});
|
|
it('should extract ID from populated document without relationTo wrapper', () => {
|
|
const value = {
|
|
id: 'user222',
|
|
name: 'Jane Doe',
|
|
email: 'jane@example.com'
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('user222');
|
|
});
|
|
it('should handle null values', () => {
|
|
const result = normalizeRelationshipValue(null, relationTo);
|
|
expect(result).toBeNull();
|
|
});
|
|
it('should handle undefined values', () => {
|
|
const result = normalizeRelationshipValue(undefined, relationTo);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
it('should handle empty object', () => {
|
|
const result = normalizeRelationshipValue({}, relationTo);
|
|
expect(result).toEqual({});
|
|
});
|
|
});
|
|
describe('Polymorphic relationships (array relationTo)', () => {
|
|
const relationTo = ['users', 'posts', 'pages'];
|
|
it('should return simple string ID as-is', () => {
|
|
const result = normalizeRelationshipValue('user123', relationTo);
|
|
expect(result).toBe('user123');
|
|
});
|
|
it('should return simple number ID as-is', () => {
|
|
const result = normalizeRelationshipValue(456, relationTo);
|
|
expect(result).toBe(456);
|
|
});
|
|
it('should preserve relationTo structure with string value', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: 'user789'
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'users',
|
|
value: 'user789'
|
|
});
|
|
});
|
|
it('should preserve relationTo structure with number value', () => {
|
|
const value = {
|
|
relationTo: 'posts',
|
|
value: 123
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'posts',
|
|
value: 123
|
|
});
|
|
});
|
|
it('should extract ID from nested value structure', () => {
|
|
const value = {
|
|
relationTo: 'posts',
|
|
value: {
|
|
value: 'post456'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'posts',
|
|
value: 'post456'
|
|
});
|
|
});
|
|
it('should extract ID from deeply nested value structure', () => {
|
|
const value = {
|
|
relationTo: 'pages',
|
|
value: {
|
|
value: {
|
|
value: 'page789'
|
|
}
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'pages',
|
|
value: 'page789'
|
|
});
|
|
});
|
|
it('should extract ID from populated document', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: {
|
|
id: 'user999',
|
|
name: 'John Smith',
|
|
email: 'john.smith@example.com'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'users',
|
|
value: 'user999'
|
|
});
|
|
});
|
|
it('should extract ID from complex populated document', () => {
|
|
const value = {
|
|
relationTo: 'posts',
|
|
value: {
|
|
id: 'post123',
|
|
title: 'My Post',
|
|
author: {
|
|
id: 'author456',
|
|
name: 'Author Name'
|
|
},
|
|
createdAt: '2023-01-01T00:00:00.000Z'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toEqual({
|
|
relationTo: 'posts',
|
|
value: 'post123'
|
|
});
|
|
});
|
|
it('should handle different relationTo values', () => {
|
|
const values = [{
|
|
relationTo: 'users',
|
|
value: 'user1'
|
|
}, {
|
|
relationTo: 'posts',
|
|
value: 'post2'
|
|
}, {
|
|
relationTo: 'pages',
|
|
value: 'page3'
|
|
}];
|
|
const results = values.map(v => normalizeRelationshipValue(v, relationTo));
|
|
expect(results).toEqual([{
|
|
relationTo: 'users',
|
|
value: 'user1'
|
|
}, {
|
|
relationTo: 'posts',
|
|
value: 'post2'
|
|
}, {
|
|
relationTo: 'pages',
|
|
value: 'page3'
|
|
}]);
|
|
});
|
|
it('should handle null values', () => {
|
|
const result = normalizeRelationshipValue(null, relationTo);
|
|
expect(result).toBeNull();
|
|
});
|
|
it('should handle undefined values', () => {
|
|
const result = normalizeRelationshipValue(undefined, relationTo);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
it('should extract ID from populated document without relationTo wrapper', () => {
|
|
const value = {
|
|
id: 'doc123',
|
|
title: 'Document Title'
|
|
};
|
|
const result = normalizeRelationshipValue(value, relationTo);
|
|
expect(result).toBe('doc123');
|
|
});
|
|
});
|
|
describe('Edge cases', () => {
|
|
it('should handle object with only value property (no relationTo)', () => {
|
|
const value = {
|
|
value: 'someValue'
|
|
};
|
|
const result = normalizeRelationshipValue(value, 'users');
|
|
// Since there's no 'id' field and no relationTo, it should return the value as-is
|
|
expect(result).toEqual({
|
|
value: 'someValue'
|
|
});
|
|
});
|
|
it('should handle object with relationTo but no value', () => {
|
|
const value = {
|
|
relationTo: 'users'
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['users', 'posts']);
|
|
expect(result).toEqual({
|
|
relationTo: 'users'
|
|
});
|
|
});
|
|
it('should handle empty array relationTo', () => {
|
|
const result = normalizeRelationshipValue('user123', []);
|
|
expect(result).toBe('user123');
|
|
});
|
|
it('should handle single-item array relationTo as polymorphic', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: 'user123'
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['users']);
|
|
expect(result).toEqual({
|
|
relationTo: 'users',
|
|
value: 'user123'
|
|
});
|
|
});
|
|
it('should handle numeric IDs in populated documents', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: {
|
|
id: 12345,
|
|
name: 'User with numeric ID'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['users', 'posts']);
|
|
expect(result).toEqual({
|
|
relationTo: 'users',
|
|
value: 12345
|
|
});
|
|
});
|
|
it('should handle nested null values', () => {
|
|
const value = {
|
|
relationTo: 'users',
|
|
value: null
|
|
};
|
|
const result = normalizeRelationshipValue(value, 'users');
|
|
expect(result).toBeNull();
|
|
});
|
|
it('should handle zero as a valid ID', () => {
|
|
const result = normalizeRelationshipValue(0, 'users');
|
|
expect(result).toBe(0);
|
|
});
|
|
it('should handle empty string as a valid ID', () => {
|
|
const result = normalizeRelationshipValue('', 'users');
|
|
expect(result).toBe('');
|
|
});
|
|
it('should handle false as a value', () => {
|
|
const result = normalizeRelationshipValue(false, 'users');
|
|
expect(result).toBe(false);
|
|
});
|
|
it('should handle array values (return as-is)', () => {
|
|
const result = normalizeRelationshipValue(['user1', 'user2'], 'users');
|
|
expect(result).toEqual(['user1', 'user2']);
|
|
});
|
|
});
|
|
describe('Real-world scenarios', () => {
|
|
it('should normalize upload field value for monomorphic upload', () => {
|
|
// Upload field with populated media document
|
|
const value = {
|
|
id: 'media123',
|
|
filename: 'image.jpg',
|
|
mimeType: 'image/jpeg',
|
|
filesize: 12345,
|
|
url: '/media/image.jpg'
|
|
};
|
|
const result = normalizeRelationshipValue(value, 'media');
|
|
expect(result).toBe('media123');
|
|
});
|
|
it('should normalize upload field value for polymorphic upload', () => {
|
|
// Upload field with relationTo structure
|
|
const value = {
|
|
relationTo: 'images',
|
|
value: {
|
|
id: 'image456',
|
|
filename: 'photo.png',
|
|
url: '/media/photo.png'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['images', 'videos']);
|
|
expect(result).toEqual({
|
|
relationTo: 'images',
|
|
value: 'image456'
|
|
});
|
|
});
|
|
it('should normalize form submission data', () => {
|
|
// Data coming from form with populated relationship
|
|
const value = {
|
|
relationTo: 'posts',
|
|
value: {
|
|
id: 'post789',
|
|
title: 'Blog Post Title',
|
|
author: {
|
|
id: 'author123',
|
|
name: 'Author'
|
|
},
|
|
publishedDate: '2023-12-01'
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['posts', 'pages']);
|
|
expect(result).toEqual({
|
|
relationTo: 'posts',
|
|
value: 'post789'
|
|
});
|
|
});
|
|
it('should normalize API response with nested relationships', () => {
|
|
// Complex nested structure from API
|
|
const value = {
|
|
relationTo: 'categories',
|
|
value: {
|
|
value: {
|
|
id: 'cat123',
|
|
name: 'Category Name'
|
|
}
|
|
}
|
|
};
|
|
const result = normalizeRelationshipValue(value, ['categories', 'tags']);
|
|
expect(result).toEqual({
|
|
relationTo: 'categories',
|
|
value: 'cat123'
|
|
});
|
|
});
|
|
it('should handle table cell data normalization', () => {
|
|
// Cell data from table that might be just an ID
|
|
const simpleValue = 'user123';
|
|
const result = normalizeRelationshipValue(simpleValue, 'users');
|
|
expect(result).toBe('user123');
|
|
// Cell data with full structure
|
|
const complexValue = {
|
|
relationTo: 'users',
|
|
value: {
|
|
id: 'user456',
|
|
name: 'John Doe'
|
|
}
|
|
};
|
|
const result2 = normalizeRelationshipValue(complexValue, ['users', 'admins']);
|
|
expect(result2).toEqual({
|
|
relationTo: 'users',
|
|
value: 'user456'
|
|
});
|
|
});
|
|
});
|
|
});
|
|
//# sourceMappingURL=normalizeRelationshipValue.spec.js.map |