Files
klz-cables.com/.pnpm-store/v10/files/9c/66d5747c6716512450bb76044bf4ed899cf772acdd949a00d922b3e8366bc29179a32fd317db7701bf44db21dbea76d8259941983eb6175712fc79df4ffa30
Marc Mintel 5397309103
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
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

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