UNPKG

@gravity-ui/data-source

Version:
292 lines (289 loc) 9.11 kB
import _typeof from "@babel/runtime/helpers/typeof"; import { createNormalizer } from '@normy/core'; import { checkMutationObjectsKeys } from '../checkMutationObjectsKeys'; var createMockNormalizer = function createMockNormalizer(objects) { var normalizer = createNormalizer({}); // Manually set normalized data for testing Object.keys(objects).forEach(function (key) { var id = key.replace('@@', ''); // Use object as-is, id is already included in objects[key] normalizer.setQuery("test-".concat(id), objects[key]); }); return normalizer; }; describe('checkMutationObjectsKeys', function () { describe('when mutation data has no normalizable objects', function () { it('should return needsRefetch: false for primitive values', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys('string value', normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); it('should return needsRefetch: false for null', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys(null, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); it('should return needsRefetch: false for empty array', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys([], normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); it('should return needsRefetch: false for object without id', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys({ name: 'test' }, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); }); describe('when mutation object is not in normalized store', function () { it('should return needsRefetch: false for new object', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys({ id: 'new-id', name: 'test' }, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); }); describe('when mutation has same keys as normalized data', function () { it('should return needsRefetch: false for identical keys', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', name: 'test', value: 100 } }); var result = checkMutationObjectsKeys({ id: '1', name: 'updated', value: 200 }, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); it('should return needsRefetch: false when keys are same but in different order', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', a: 1, b: 2, c: 3 } }); var result = checkMutationObjectsKeys({ c: 30, a: 10, b: 20, id: '1' }, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); }); describe('when mutation has fewer keys than normalized data', function () { it('should return needsRefetch: true with missing keys', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', name: 'test', email: 'test@example.com', age: 25 } }); var result = checkMutationObjectsKeys({ id: '1', name: 'updated' }, normalizer); expect(result.needsRefetch).toBe(true); expect(result.details).toHaveLength(1); expect(result.details[0].id).toBe('1'); expect(result.details[0].missingKeys).toContain('email'); expect(result.details[0].missingKeys).toContain('age'); }); it('should return needsRefetch: true when only id is present', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', field1: 'a', field2: 'b', field3: 'c' } }); var result = checkMutationObjectsKeys({ id: '1' }, normalizer); expect(result.needsRefetch).toBe(true); expect(result.details[0].missingKeys).toEqual(expect.arrayContaining(['field1', 'field2', 'field3'])); }); }); describe('when mutation has different keys than normalized data', function () { it('should return needsRefetch: true when mutation has fewer keys even if some are different', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', oldField: 'old', anotherField: 'value' } }); // Mutation has fewer keys (2 vs 3), so needsRefetch should be true var result = checkMutationObjectsKeys({ id: '1', newField: 'new' }, normalizer); expect(result.needsRefetch).toBe(true); expect(result.details[0].missingKeys).toContain('oldField'); expect(result.details[0].missingKeys).toContain('anotherField'); }); }); describe('with array of objects', function () { it('should check all objects in array', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', name: 'first', extra: 'data' }, '@@2': { id: '2', name: 'second', extra: 'data' } }); var result = checkMutationObjectsKeys([{ id: '1', name: 'updated' }, { id: '2', name: 'updated' }], normalizer); expect(result.needsRefetch).toBe(true); expect(result.details).toHaveLength(2); expect(result.details[0].id).toBe('1'); expect(result.details[1].id).toBe('2'); }); it('should handle nested arrays', function () { var normalizer = createMockNormalizer({ '@@1': { id: '1', field: 'a', extra: 'b' }, '@@2': { id: '2', field: 'c', extra: 'd' } }); var result = checkMutationObjectsKeys([[{ id: '1', field: 'updated' }], [{ id: '2', field: 'updated' }]], normalizer); expect(result.needsRefetch).toBe(true); expect(result.details).toHaveLength(2); }); }); describe('with custom getNormalizationObjectKey', function () { it('should use custom key function', function () { var normalizer = createNormalizer({ getNormalizationObjectKey: function getNormalizationObjectKey(obj) { return obj && _typeof(obj) === 'object' && '_id' in obj ? String(obj._id) : undefined; } }); // Set query with custom key normalizer.setQuery('test', { _id: 'custom-1', name: 'test', extra: 'field' }); var result = checkMutationObjectsKeys({ _id: 'custom-1', name: 'updated' }, normalizer, { getNormalizationObjectKey: function getNormalizationObjectKey(obj) { return '_id' in obj ? String(obj._id) : undefined; } }); expect(result.needsRefetch).toBe(true); expect(result.details[0].id).toBe('custom-1'); }); }); describe('edge cases', function () { it('should handle object with undefined id', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys({ id: undefined, name: 'test' }, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); it('should handle object with numeric id', function () { var normalizer = createMockNormalizer({ '@@123': { id: '123', value: 'test', extra: 'field' } }); var result = checkMutationObjectsKeys({ id: '123', value: 'updated' }, normalizer); expect(result.needsRefetch).toBe(true); }); it('should handle large number of objects', function () { var objects = {}; var mutationData = []; for (var i = 0; i < 100; i++) { objects["@@".concat(i)] = { id: String(i), name: "item-".concat(i), extra: 'field' }; mutationData.push({ id: String(i), name: "updated-".concat(i) }); } var normalizer = createMockNormalizer(objects); var result = checkMutationObjectsKeys(mutationData, normalizer); expect(result.needsRefetch).toBe(true); expect(result.details).toHaveLength(100); }); it('should handle empty object', function () { var normalizer = createMockNormalizer({}); var result = checkMutationObjectsKeys({}, normalizer); expect(result).toEqual({ needsRefetch: false, details: [] }); }); }); }); // #sourceMappingURL=checkMutationObjectsKeys.test.js.map