@gravity-ui/data-source
Version:
A wrapper around data fetching
292 lines (289 loc) • 9.11 kB
JavaScript
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