From ddedf7aab5142a652116f4db82d6e2e828c9dab9 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 10 Sep 2021 17:44:06 +0200 Subject: [PATCH] version-bridge: added tests Signed-off-by: Patrik Oldsberg --- .../src/lib/VersionedContext.test.tsx | 100 ++++++++++++++++++ .../src/lib/VersionedValue.test.ts | 40 +++++++ 2 files changed, 140 insertions(+) create mode 100644 packages/version-bridge/src/lib/VersionedContext.test.tsx create mode 100644 packages/version-bridge/src/lib/VersionedValue.test.ts diff --git a/packages/version-bridge/src/lib/VersionedContext.test.tsx b/packages/version-bridge/src/lib/VersionedContext.test.tsx new file mode 100644 index 0000000000..bbd924780d --- /dev/null +++ b/packages/version-bridge/src/lib/VersionedContext.test.tsx @@ -0,0 +1,100 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useContext } from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { + createVersionedContext, + createVersionedContextForTesting, + useVersionedContext, +} from './VersionedContext'; +import { createVersionedValueMap } from './VersionedValue'; + +type ContextType = { 1: string; 2: string }; + +describe('VersionedContext', () => { + it('should provide a versioned value', () => { + const Context = createVersionedContext('test-context-1'); + + const rendered = renderHook(() => useContext(Context), { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(rendered.result.current?.atVersion(1)).toBe('1v1'); + expect(rendered.result.current?.atVersion(2)).toBe('1v2'); + }); + + it('should provide a versioned value to hook', () => { + const Context = createVersionedContext('test-context-2'); + + const rendered = renderHook(() => useVersionedContext('test-context-2'), { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(rendered.result.current?.atVersion(1)).toBe('2v1'); + expect(rendered.result.current?.atVersion(2)).toBe('2v2'); + }); + + it('should be provide a test utility', () => { + const context = createVersionedContextForTesting('test-context-3'); + + const rendered = renderHook(() => useVersionedContext('test-context-3')); + + expect(() => rendered.result.current).toThrow( + 'Global test-context-3 is not set', + ); + context.set({ 1: '3v1' }); + expect(() => rendered.result.current).toThrow( + 'Global test-context-3 is not set', + ); + // should need a rerender before update + rendered.rerender(); + + expect(rendered.result.current?.atVersion(1)).toBe('3v1'); + expect(rendered.result.current?.atVersion(2)).toBeUndefined(); + + context.set({ 2: '3v2' }); + rendered.rerender(); + + expect(rendered.result.current?.atVersion(1)).toBeUndefined(); + expect(rendered.result.current?.atVersion(2)).toBe('3v2'); + + context.reset(); + rendered.rerender(); + expect(() => rendered.result.current).toThrow( + 'Global test-context-3 is not set', + ); + + context.set({ 1: '3v1', 2: '3v2' }); + + rendered.rerender(); + + expect(rendered.result.current?.atVersion(1)).toBe('3v1'); + expect(rendered.result.current?.atVersion(2)).toBe('3v2'); + }); +}); diff --git a/packages/version-bridge/src/lib/VersionedValue.test.ts b/packages/version-bridge/src/lib/VersionedValue.test.ts new file mode 100644 index 0000000000..2b6637a96f --- /dev/null +++ b/packages/version-bridge/src/lib/VersionedValue.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createVersionedValueMap } from './VersionedValue'; + +describe('createVersionedValueMap', () => { + it('should be empty', () => { + const map = createVersionedValueMap({}); + + // @ts-expect-error + expect(map.atVersion(1 as any)).toBe(undefined); + }); + + it('should access values by version', () => { + const map = createVersionedValueMap({ 1: 'v1', 2: 'v2' }); + + expect(map.atVersion(1)).toBe('v1'); + expect(map.atVersion(2)).toBe('v2'); + + // @ts-expect-error + expect(map.atVersion(0)).toBe(undefined); + // @ts-expect-error + expect(map.atVersion(NaN)).toBe(undefined); + // @ts-expect-error + expect(map.atVersion(Infinity)).toBe(undefined); + }); +});