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/dom": "8.11.3", | ||||||
|     "@testing-library/jest-dom": "5.16.2", |     "@testing-library/jest-dom": "5.16.2", | ||||||
|     "@testing-library/react": "12.1.4", |     "@testing-library/react": "12.1.4", | ||||||
|  |     "@testing-library/react-hooks": "^7.0.2", | ||||||
|     "@testing-library/user-event": "13.5.0", |     "@testing-library/user-event": "13.5.0", | ||||||
|     "@types/debounce": "1.2.1", |     "@types/debounce": "1.2.1", | ||||||
|     "@types/deep-diff": "1.0.1", |     "@types/deep-diff": "1.0.1", | ||||||
| @ -80,8 +81,8 @@ | |||||||
|     "react-scripts": "4.0.3", |     "react-scripts": "4.0.3", | ||||||
|     "react-test-renderer": "17.0.2", |     "react-test-renderer": "17.0.2", | ||||||
|     "react-timeago": "6.2.1", |     "react-timeago": "6.2.1", | ||||||
|     "semver": "^7.3.5", |  | ||||||
|     "sass": "1.49.9", |     "sass": "1.49.9", | ||||||
|  |     "semver": "^7.3.5", | ||||||
|     "swr": "1.2.2", |     "swr": "1.2.2", | ||||||
|     "typescript": "4.6.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" |     lodash "^4.17.15" | ||||||
|     redent "^3.0.0" |     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": | "@testing-library/react@12.1.4": | ||||||
|   version "12.1.4" |   version "12.1.4" | ||||||
|   resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.4.tgz#09674b117e550af713db3f4ec4c0942aa8bbf2c0" |   resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.4.tgz#09674b117e550af713db3f4ec4c0942aa8bbf2c0" | ||||||
| @ -2038,7 +2049,7 @@ | |||||||
|   dependencies: |   dependencies: | ||||||
|     "@types/react" "*" |     "@types/react" "*" | ||||||
| 
 | 
 | ||||||
| "@types/react-dom@17.0.13": | "@types/react-dom@17.0.13", "@types/react-dom@>=16.9.0": | ||||||
|   version "17.0.13" |   version "17.0.13" | ||||||
|   resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" |   resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" | ||||||
|   integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== |   integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== | ||||||
| @ -2062,7 +2073,7 @@ | |||||||
|     "@types/history" "*" |     "@types/history" "*" | ||||||
|     "@types/react" "*" |     "@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" |   version "17.0.1" | ||||||
|   resolved "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz" |   resolved "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz" | ||||||
|   integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw== |   integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw== | ||||||
| @ -2092,7 +2103,7 @@ | |||||||
|     "@types/scheduler" "*" |     "@types/scheduler" "*" | ||||||
|     csstype "^3.0.2" |     csstype "^3.0.2" | ||||||
| 
 | 
 | ||||||
| "@types/react@17.0.40": | "@types/react@17.0.40", "@types/react@>=16.9.0": | ||||||
|   version "17.0.40" |   version "17.0.40" | ||||||
|   resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.40.tgz#dc010cee6254d5239a138083f3799a16638e6bad" |   resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.40.tgz#dc010cee6254d5239a138083f3799a16638e6bad" | ||||||
|   integrity sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ== |   integrity sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ== | ||||||
| @ -10051,6 +10062,13 @@ react-dom@17.0.2: | |||||||
|     object-assign "^4.1.1" |     object-assign "^4.1.1" | ||||||
|     scheduler "^0.20.2" |     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: | react-error-overlay@^6.0.9: | ||||||
|   version "6.0.9" |   version "6.0.9" | ||||||
|   resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz" |   resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user