mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	refactor: test useFeaturesFilter (#795)
This commit is contained in:
		
							parent
							
								
									bee9fadbc9
								
							
						
					
					
						commit
						d1e96501ec
					
				@ -44,6 +44,7 @@
 | 
			
		||||
    "@testing-library/dom": "8.11.3",
 | 
			
		||||
    "@testing-library/jest-dom": "5.16.2",
 | 
			
		||||
    "@testing-library/react": "12.1.4",
 | 
			
		||||
    "@testing-library/react-hooks": "^7.0.2",
 | 
			
		||||
    "@testing-library/user-event": "13.5.0",
 | 
			
		||||
    "@types/debounce": "1.2.1",
 | 
			
		||||
    "@types/deep-diff": "1.0.1",
 | 
			
		||||
@ -80,8 +81,8 @@
 | 
			
		||||
    "react-scripts": "4.0.3",
 | 
			
		||||
    "react-test-renderer": "17.0.2",
 | 
			
		||||
    "react-timeago": "6.2.1",
 | 
			
		||||
    "semver": "^7.3.5",
 | 
			
		||||
    "sass": "1.49.9",
 | 
			
		||||
    "semver": "^7.3.5",
 | 
			
		||||
    "swr": "1.2.2",
 | 
			
		||||
    "typescript": "4.6.2"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										213
									
								
								frontend/src/hooks/__snapshots__/useFeaturesFilter.test.ts.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								frontend/src/hooks/__snapshots__/useFeaturesFilter.test.ts.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,213 @@
 | 
			
		||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
 | 
			
		||||
 | 
			
		||||
exports[`useFeaturesFilter constraints 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "filter": Object {
 | 
			
		||||
    "project": "*",
 | 
			
		||||
    "query": "xyz",
 | 
			
		||||
  },
 | 
			
		||||
  "filtered": Array [
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "a",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [
 | 
			
		||||
        Object {
 | 
			
		||||
          "constraints": Array [],
 | 
			
		||||
          "id": "1",
 | 
			
		||||
          "name": "1",
 | 
			
		||||
          "parameters": Object {},
 | 
			
		||||
        },
 | 
			
		||||
        Object {
 | 
			
		||||
          "constraints": Array [],
 | 
			
		||||
          "id": "1",
 | 
			
		||||
          "name": "1",
 | 
			
		||||
          "parameters": Object {},
 | 
			
		||||
        },
 | 
			
		||||
        Object {
 | 
			
		||||
          "constraints": Array [
 | 
			
		||||
            Object {
 | 
			
		||||
              "contextName": "",
 | 
			
		||||
              "operator": "IN",
 | 
			
		||||
            },
 | 
			
		||||
            Object {
 | 
			
		||||
              "contextName": "",
 | 
			
		||||
              "operator": "IN",
 | 
			
		||||
              "value": "xyz",
 | 
			
		||||
            },
 | 
			
		||||
            Object {
 | 
			
		||||
              "contextName": "",
 | 
			
		||||
              "operator": "IN",
 | 
			
		||||
              "values": Array [
 | 
			
		||||
                "xyz",
 | 
			
		||||
              ],
 | 
			
		||||
            },
 | 
			
		||||
          ],
 | 
			
		||||
          "id": "1",
 | 
			
		||||
          "name": "1",
 | 
			
		||||
          "parameters": Object {},
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  "setFilter": [Function],
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
exports[`useFeaturesFilter empty 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "filter": Object {
 | 
			
		||||
    "project": "*",
 | 
			
		||||
  },
 | 
			
		||||
  "filtered": Array [],
 | 
			
		||||
  "setFilter": [Function],
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
exports[`useFeaturesFilter equal 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "filter": Object {
 | 
			
		||||
    "project": "*",
 | 
			
		||||
  },
 | 
			
		||||
  "filtered": Array [
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "1",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "1",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "1",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  "setFilter": [Function],
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
exports[`useFeaturesFilter project 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "filter": Object {
 | 
			
		||||
    "project": "2",
 | 
			
		||||
  },
 | 
			
		||||
  "filtered": Array [
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "2",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "2",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  "setFilter": [Function],
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
exports[`useFeaturesFilter query 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "filter": Object {
 | 
			
		||||
    "project": "*",
 | 
			
		||||
    "query": "bc",
 | 
			
		||||
  },
 | 
			
		||||
  "filtered": Array [
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "abc",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
    Object {
 | 
			
		||||
      "archived": false,
 | 
			
		||||
      "createdAt": "22006-01-02T15:04:05Z",
 | 
			
		||||
      "description": "1",
 | 
			
		||||
      "enabled": false,
 | 
			
		||||
      "environments": Array [],
 | 
			
		||||
      "impressionData": false,
 | 
			
		||||
      "lastSeenAt": "2006-01-02T15:04:05Z",
 | 
			
		||||
      "name": "1",
 | 
			
		||||
      "project": "abcd",
 | 
			
		||||
      "stale": false,
 | 
			
		||||
      "strategies": Array [],
 | 
			
		||||
      "type": "1",
 | 
			
		||||
      "variants": Array [],
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  "setFilter": [Function],
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
							
								
								
									
										129
									
								
								frontend/src/hooks/useFeaturesFilter.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								frontend/src/hooks/useFeaturesFilter.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,129 @@
 | 
			
		||||
import { renderHook, act } from '@testing-library/react-hooks';
 | 
			
		||||
import { useFeaturesFilter } from 'hooks/useFeaturesFilter';
 | 
			
		||||
import { IFeatureToggle } from 'interfaces/featureToggle';
 | 
			
		||||
import { IConstraint, IFeatureStrategy } from 'interfaces/strategy';
 | 
			
		||||
 | 
			
		||||
test('useFeaturesFilter empty', () => {
 | 
			
		||||
    const { result } = renderHook(() => useFeaturesFilter([]));
 | 
			
		||||
 | 
			
		||||
    expect(result.current.filtered.length).toEqual(0);
 | 
			
		||||
    expect(result.current).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('useFeaturesFilter equal', () => {
 | 
			
		||||
    const { result } = renderHook(() =>
 | 
			
		||||
        useFeaturesFilter([
 | 
			
		||||
            mockFeatureToggle(),
 | 
			
		||||
            mockFeatureToggle(),
 | 
			
		||||
            mockFeatureToggle(),
 | 
			
		||||
        ])
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    expect(result.current.filtered.length).toEqual(3);
 | 
			
		||||
    expect(result.current).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('useFeaturesFilter project', () => {
 | 
			
		||||
    const { result } = renderHook(() =>
 | 
			
		||||
        useFeaturesFilter([
 | 
			
		||||
            mockFeatureToggle({ project: '1' }),
 | 
			
		||||
            mockFeatureToggle({ project: '2' }),
 | 
			
		||||
            mockFeatureToggle({ project: '2' }),
 | 
			
		||||
            mockFeatureToggle({ project: '3' }),
 | 
			
		||||
        ])
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    act(() => {
 | 
			
		||||
        result.current.setFilter({ project: '2' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    expect(result.current.filtered.length).toEqual(2);
 | 
			
		||||
    expect(result.current).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('useFeaturesFilter query', () => {
 | 
			
		||||
    const { result } = renderHook(() =>
 | 
			
		||||
        useFeaturesFilter([
 | 
			
		||||
            mockFeatureToggle({ project: 'a' }),
 | 
			
		||||
            mockFeatureToggle({ project: 'ab' }),
 | 
			
		||||
            mockFeatureToggle({ project: 'abc' }),
 | 
			
		||||
            mockFeatureToggle({ project: 'abcd' }),
 | 
			
		||||
        ])
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    act(() => {
 | 
			
		||||
        result.current.setFilter({ project: '*', query: 'bc' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    expect(result.current.filtered.length).toEqual(2);
 | 
			
		||||
    expect(result.current).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('useFeaturesFilter constraints', () => {
 | 
			
		||||
    const { result } = renderHook(() =>
 | 
			
		||||
        useFeaturesFilter([
 | 
			
		||||
            mockFeatureToggle({
 | 
			
		||||
                project: 'a',
 | 
			
		||||
                strategies: [
 | 
			
		||||
                    mockFeatureStrategy(),
 | 
			
		||||
                    mockFeatureStrategy(),
 | 
			
		||||
                    mockFeatureStrategy({
 | 
			
		||||
                        constraints: [
 | 
			
		||||
                            mockConstraint(),
 | 
			
		||||
                            mockConstraint({ value: 'xyz' }),
 | 
			
		||||
                            mockConstraint({ values: ['xyz'] }),
 | 
			
		||||
                        ],
 | 
			
		||||
                    }),
 | 
			
		||||
                ],
 | 
			
		||||
            }),
 | 
			
		||||
        ])
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    act(() => {
 | 
			
		||||
        result.current.setFilter({ project: '*', query: 'xyz' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    expect(result.current.filtered.length).toEqual(1);
 | 
			
		||||
    expect(result.current).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const mockFeatureToggle = (
 | 
			
		||||
    overrides?: Partial<IFeatureToggle>
 | 
			
		||||
): IFeatureToggle => {
 | 
			
		||||
    return {
 | 
			
		||||
        name: '1',
 | 
			
		||||
        description: '1',
 | 
			
		||||
        type: '1',
 | 
			
		||||
        project: '1',
 | 
			
		||||
        archived: false,
 | 
			
		||||
        enabled: false,
 | 
			
		||||
        stale: false,
 | 
			
		||||
        impressionData: false,
 | 
			
		||||
        strategies: [],
 | 
			
		||||
        variants: [],
 | 
			
		||||
        environments: [],
 | 
			
		||||
        createdAt: '22006-01-02T15:04:05Z',
 | 
			
		||||
        lastSeenAt: '2006-01-02T15:04:05Z',
 | 
			
		||||
        ...overrides,
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const mockFeatureStrategy = (
 | 
			
		||||
    overrides?: Partial<IFeatureStrategy>
 | 
			
		||||
): IFeatureStrategy => {
 | 
			
		||||
    return {
 | 
			
		||||
        id: '1',
 | 
			
		||||
        name: '1',
 | 
			
		||||
        constraints: [],
 | 
			
		||||
        parameters: {},
 | 
			
		||||
        ...overrides,
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const mockConstraint = (overrides?: Partial<IConstraint>): IConstraint => {
 | 
			
		||||
    return {
 | 
			
		||||
        contextName: '',
 | 
			
		||||
        operator: 'IN',
 | 
			
		||||
        ...overrides,
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
@ -1805,6 +1805,17 @@
 | 
			
		||||
    lodash "^4.17.15"
 | 
			
		||||
    redent "^3.0.0"
 | 
			
		||||
 | 
			
		||||
"@testing-library/react-hooks@^7.0.2":
 | 
			
		||||
  version "7.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz#3388d07f562d91e7f2431a4a21b5186062ecfee0"
 | 
			
		||||
  integrity sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@babel/runtime" "^7.12.5"
 | 
			
		||||
    "@types/react" ">=16.9.0"
 | 
			
		||||
    "@types/react-dom" ">=16.9.0"
 | 
			
		||||
    "@types/react-test-renderer" ">=16.9.0"
 | 
			
		||||
    react-error-boundary "^3.1.0"
 | 
			
		||||
 | 
			
		||||
"@testing-library/react@12.1.4":
 | 
			
		||||
  version "12.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.4.tgz#09674b117e550af713db3f4ec4c0942aa8bbf2c0"
 | 
			
		||||
@ -2038,7 +2049,7 @@
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/react" "*"
 | 
			
		||||
 | 
			
		||||
"@types/react-dom@17.0.13":
 | 
			
		||||
"@types/react-dom@17.0.13", "@types/react-dom@>=16.9.0":
 | 
			
		||||
  version "17.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809"
 | 
			
		||||
  integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==
 | 
			
		||||
@ -2062,7 +2073,7 @@
 | 
			
		||||
    "@types/history" "*"
 | 
			
		||||
    "@types/react" "*"
 | 
			
		||||
 | 
			
		||||
"@types/react-test-renderer@17.0.1":
 | 
			
		||||
"@types/react-test-renderer@17.0.1", "@types/react-test-renderer@>=16.9.0":
 | 
			
		||||
  version "17.0.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz"
 | 
			
		||||
  integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==
 | 
			
		||||
@ -2092,7 +2103,7 @@
 | 
			
		||||
    "@types/scheduler" "*"
 | 
			
		||||
    csstype "^3.0.2"
 | 
			
		||||
 | 
			
		||||
"@types/react@17.0.40":
 | 
			
		||||
"@types/react@17.0.40", "@types/react@>=16.9.0":
 | 
			
		||||
  version "17.0.40"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.40.tgz#dc010cee6254d5239a138083f3799a16638e6bad"
 | 
			
		||||
  integrity sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==
 | 
			
		||||
@ -10051,6 +10062,13 @@ react-dom@17.0.2:
 | 
			
		||||
    object-assign "^4.1.1"
 | 
			
		||||
    scheduler "^0.20.2"
 | 
			
		||||
 | 
			
		||||
react-error-boundary@^3.1.0:
 | 
			
		||||
  version "3.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0"
 | 
			
		||||
  integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@babel/runtime" "^7.12.5"
 | 
			
		||||
 | 
			
		||||
react-error-overlay@^6.0.9:
 | 
			
		||||
  version "6.0.9"
 | 
			
		||||
  resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user