fix: scaffolder secret forwarding

Signed-off-by: blam <ben@blam.sh>
This commit is contained in:
blam
2024-12-20 09:58:56 +01:00
parent c03e1b0fd6
commit 3f09ef4bab
3 changed files with 77 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Fix issue with `secrets` not being forwarded properly to the backend when creating a task
@@ -81,4 +81,75 @@ describe('useFormDecorators', () => {
expect(mockApiImplementation.test).toHaveBeenCalledWith('hello');
});
});
it('should return existing secrets and formstate', async () => {
const renderedHook = renderHook(() => useFormDecorators({ manifest }), {
wrapper: ({ children }) => (
<TestApiProvider
apis={[
[mockApiRef, mockApiImplementation],
[
formDecoratorsApiRef,
DefaultScaffolderFormDecoratorsApi.create({
decorators: [mockDecorator],
}),
],
[errorApiRef, { post: () => {} }],
]}
>
{children}
</TestApiProvider>
),
});
await waitFor(async () => {
const result = renderedHook.result.current!;
const { secrets, formState } = await result.run({
formState: { test: 'formState' },
secrets: { test: 'hello' },
});
expect(secrets).toEqual({ test: 'hello' });
expect(formState).toEqual({ test: 'formState' });
});
});
it('should allow merging of existing secrets and formstate', async () => {
const secretAndFormDataModifier = createScaffolderFormDecorator({
id: 'test',
async decorator({ setFormState, setSecrets }) {
setFormState(state => ({ ...state, new: 'formState' }));
setSecrets(state => ({ ...state, new: 'hello' }));
},
});
const renderedHook = renderHook(() => useFormDecorators({ manifest }), {
wrapper: ({ children }) => (
<TestApiProvider
apis={[
[mockApiRef, mockApiImplementation],
[
formDecoratorsApiRef,
DefaultScaffolderFormDecoratorsApi.create({
decorators: [mockDecorator, secretAndFormDataModifier],
}),
],
[errorApiRef, { post: () => {} }],
]}
>
{children}
</TestApiProvider>
),
});
await waitFor(async () => {
const result = renderedHook.result.current!;
const { secrets, formState } = await result.run({
formState: { test: 'formState' },
secrets: { test: 'hello' },
});
expect(secrets).toEqual({ test: 'hello', new: 'hello' });
expect(formState).toEqual({ test: 'formState', new: 'formState' });
});
});
});
@@ -75,7 +75,7 @@ export const useFormDecorators = ({
secrets: Record<string, string>;
}) => {
let formState: Record<string, JsonValue> = { ...opts.formState };
let secrets: Record<string, string> = {};
let secrets: Record<string, string> = { ...opts.secrets };
if (manifest?.EXPERIMENTAL_formDecorators) {
// for each of the form decorators, go and call the decorator with the context