Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AN-149] Rename 'namespace' to 'collection' & update feature preview section #5212

Merged
merged 7 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions src/libs/feature-previews-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,13 @@ const featurePreviewsConfig: readonly FeaturePreview[] = [
},
{
id: FIRECLOUD_UI_MIGRATION,
title: 'Firecloud UI Feature Migration',
description: 'Enabling this feature will update replaceable links to Firecloud UI with new links to Terra UI',
feedbackUrl: `mailto:[email protected]?subject=${encodeURIComponent(
'Feedback on deprecating Firecloud UI'
title: 'Terra Workflow Repository Improvements',
description:
"Enabling this feature will gives users access to the new Terra Workflow Repository UI. This replaces the Broad Methods Repository UI (and doesn't affect any workflows previously created).",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I attempted to emphasize what had been missing in Terra (create & edit) and try to explain that these are two UIs viewing the same backend data.

Suggested change
"Enabling this feature will gives users access to the new Terra Workflow Repository UI. This replaces the Broad Methods Repository UI (and doesn't affect any workflows previously created).",
"Create and edit workflows with the built-in Terra Workflow Repository UI. Changes made in Terra are reflected in the external Broad Methods Repository, and vice-versa.",

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about this? This also conveys that Broad Methods Repository is being replaced. 🤔

Enabling this feature will allow creating and editing workflows with the built-in Terra Workflow Repository UI. This replaces the external 
Broad Methods Repository. But changes made in Terra are reflected in the external Broad Methods Repository, and vice-versa.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems good to me!

feedbackUrl: `mailto:[email protected]?subject=${encodeURIComponent(
'Feedback on Terra Workflow Repository Improvements'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reviewers: This was requested by Beth and I did it as part of this PR itself. Please let me know if there is any wording improvements that can be done, especially for the description.

)}`,
lastUpdated: '3/22/2024',
lastUpdated: '1/7/2025',
articleUrl: 'https://support.terra.bio/hc/en-us/articles/31191238873243',
},
{
Expand Down
18 changes: 10 additions & 8 deletions src/pages/workflows/WorkflowList.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ describe('workflows table', () => {
expect(methodCells[4]).toHaveTextContent('1');
});

it('allows editing permissions for namespace owned by user', async () => {
it('allows editing permissions for collection owned by user', async () => {
// Arrange
asMockedFn(Methods).mockReturnValue(mockMethods([revaliMethod]));
const user: UserEvent = userEvent.setup();
Expand Down Expand Up @@ -291,14 +291,14 @@ describe('workflows table', () => {
await user.click(actionsMenu);

// Assert
expect(screen.getByText('Edit namespace permissions'));
expect(screen.getByText('Edit collection permissions'));

// Act
await user.click(screen.getByRole('button', { name: 'Edit namespace permissions' }));
await user.click(screen.getByRole('button', { name: 'Edit collection permissions' }));

// Assert
expect(
screen.queryByRole('dialog', { name: /Edit permissions for namespace revali bird namespace/i })
screen.queryByRole('dialog', { name: /Edit permissions for collection revali bird namespace/i })
).toBeInTheDocument();
});

Expand Down Expand Up @@ -960,8 +960,8 @@ describe('create workflow modal', () => {
expect(within(createWorkflowModal).getByText('Create New Workflow')).toBeInTheDocument();
expect(within(createWorkflowModal).getByRole('button', { name: 'Upload' })).toBeInTheDocument();

expect(within(createWorkflowModal).getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('');
expect(within(createWorkflowModal).getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('');
expect(within(createWorkflowModal).getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('');
expect(within(createWorkflowModal).getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue('');
expect(within(createWorkflowModal).getByTestId('wdl editor')).toHaveDisplayValue('');
expect(within(createWorkflowModal).getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('');
expect(
Expand All @@ -985,8 +985,10 @@ describe('create workflow modal', () => {

await user.click(screen.getByRole('button', { name: 'Create New Workflow' }));

fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), { target: { value: 'testnamespace' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Name *' }), { target: { value: 'testname' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), {
target: { value: 'testnamespace' },
});
fireEvent.change(screen.getByRole('textbox', { name: 'Workflow name *' }), { target: { value: 'testname' } });
fireEvent.change(screen.getByTestId('wdl editor'), { target: { value: 'workflow hi {}' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Documentation' }), { target: { value: 'docs' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' }), {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/workflows/WorkflowList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ export const WorkflowList = (props: WorkflowListProps) => {
</div>
{editNamespacePermissionsModalOpen && (
<PermissionsModal
versionOrNamespace='Namespace'
versionOrCollection='Collection'
namespace={namespacePermissionsToEdit}
setPermissionsModalOpen={setEditNamespacePermissionsModalOpen}
refresh={() => {}} // there is no need to refresh the page as permissions are always fetched when opening PermissionsModal
Expand Down Expand Up @@ -347,7 +347,7 @@ const getColumns = (
content={
<MenuButton tooltipSide='right' onClick={() => onEditNamespacePermissions(namespace)}>
{makeMenuIcon('edit')}
Edit namespace permissions
Edit collection permissions
</MenuButton>
}
>
Expand Down
21 changes: 12 additions & 9 deletions src/pages/workflows/workflow-details/WorkflowWrapper.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -465,8 +465,8 @@ describe('workflows container', () => {

// Assert
expect(dialog).toBeInTheDocument();
expect(within(dialog).getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('testname_copy');
expect(within(dialog).getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue('testname_copy');
expect(within(dialog).getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('mock documentation');
expect(within(dialog).getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Version comment' })).toHaveDisplayValue('');
Expand Down Expand Up @@ -500,15 +500,15 @@ describe('workflows container', () => {

// Assert
expect(dialog).toBeInTheDocument();
expect(within(dialog).getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('testname_copy');
expect(within(dialog).getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue('testname_copy');
expect(within(dialog).getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('mock documentation');
expect(within(dialog).getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Version comment' })).toHaveDisplayValue('');
expect(within(dialog).getByTestId('wdl editor')).toHaveDisplayValue(mockSnapshot.payload.toString());

// Act
fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), {
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), {
target: { value: 'groot-new-namespace' },
});
fireEvent.change(screen.getByRole('textbox', { name: 'Version comment' }), {
Expand Down Expand Up @@ -599,10 +599,13 @@ describe('workflows container', () => {

// Assert
expect(dialog).toBeInTheDocument();
expect(within(dialog).getByRole('textbox', { name: 'Namespace' })).toHaveAttribute('placeholder', 'testnamespace');
expect(within(dialog).getByRole('textbox', { name: 'Namespace' })).toHaveAttribute('disabled');
expect(within(dialog).getByRole('textbox', { name: 'Name' })).toHaveAttribute('placeholder', 'testname');
expect(within(dialog).getByRole('textbox', { name: 'Name' })).toHaveAttribute('disabled');
expect(within(dialog).getByRole('textbox', { name: 'Collection name' })).toHaveAttribute(
'placeholder',
'testnamespace'
);
expect(within(dialog).getByRole('textbox', { name: 'Collection name' })).toHaveAttribute('disabled');
expect(within(dialog).getByRole('textbox', { name: 'Workflow name' })).toHaveAttribute('placeholder', 'testname');
expect(within(dialog).getByRole('textbox', { name: 'Workflow name' })).toHaveAttribute('disabled');
expect(within(dialog).getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('mock documentation');
expect(within(dialog).getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('');
expect(within(dialog).getByRole('textbox', { name: 'Version comment' })).toHaveDisplayValue('');
Expand Down
2 changes: 1 addition & 1 deletion src/pages/workflows/workflow-details/WorkflowWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ export const WorkflowsContainer = (props: WorkflowContainerProps) => {
}),
permissionsModalOpen &&
h(PermissionsModal, {
versionOrNamespace: 'Version',
versionOrCollection: 'Version',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Incredibly glad we avoided working on snapshot => version and namespace => collection at the exact same time.

namespace,
setPermissionsModalOpen,
refresh: loadSnapshot,
Expand Down
42 changes: 22 additions & 20 deletions src/workflows/modals/CreateWorkflowModal.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ describe('CreateWorkflowModal', () => {

// Assert
expect(screen.getByText('Create New Workflow'));
expect(screen.getByText('Namespace *'));
expect(screen.getByText('Name *'));
expect(screen.getByText('Collection name *'));
expect(screen.getByText('Workflow name *'));
expect(screen.getByText('WDL *'));
expect(screen.getByRole('button', { name: 'Load WDL from file' }));
expect(screen.getByText('Documentation'));
Expand All @@ -71,8 +71,8 @@ describe('CreateWorkflowModal', () => {
expect(screen.getByRole('button', { name: 'Cancel' }));
expect(screen.getByRole('button', { name: 'Upload' }));

expect(screen.getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue('');
expect(screen.getByTestId('wdl editor')).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('');
Expand Down Expand Up @@ -102,20 +102,20 @@ describe('CreateWorkflowModal', () => {
// Act

// errors only need to appear after the inputs have been modified
fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), { target: { value: 'n' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Name *' }), { target: { value: 'n' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), { target: { value: 'n' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Workflow name *' }), { target: { value: 'n' } });

fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), { target: { value: '' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Name *' }), { target: { value: '' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), { target: { value: '' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Workflow name *' }), { target: { value: '' } });

// Assert

// we simply check for at least one instance of each error message because
// the error messages shown in the modal (under the inputs and in the
// button tooltip) do not easily correspond to those found by the testing
// framework
expect(screen.getAllByText("Namespace can't be blank"));
expect(screen.getAllByText("Name can't be blank"));
expect(screen.getAllByText("Collection name can't be blank"));
expect(screen.getAllByText("Workflow name can't be blank"));

expect(uploadButton).toHaveAttribute('aria-disabled', 'true');
});
Expand Down Expand Up @@ -145,8 +145,8 @@ describe('CreateWorkflowModal', () => {
// the error messages shown in the modal (under the inputs and in the
// button tooltip) do not easily correspond to those found by the testing
// framework
expect(screen.getAllByText('Namespace can only contain letters, numbers, underscores, dashes, and periods'));
expect(screen.getAllByText('Name can only contain letters, numbers, underscores, dashes, and periods'));
expect(screen.getAllByText('Collection name can only contain letters, numbers, underscores, dashes, and periods'));
expect(screen.getAllByText('Workflow name can only contain letters, numbers, underscores, dashes, and periods'));

expect(uploadButton).toHaveAttribute('aria-disabled', 'true');
});
Expand Down Expand Up @@ -179,7 +179,7 @@ describe('CreateWorkflowModal', () => {
// the error messages shown in the modal (under the inputs and in the
// button tooltip) do not easily correspond to those found by the testing
// framework
expect(screen.getAllByText('Namespace and name are too long (maximum is 250 characters total)'));
expect(screen.getAllByText('Collection and workflow names are too long (maximum is 250 characters total)'));

expect(uploadButton).toHaveAttribute('aria-disabled', 'true');
});
Expand Down Expand Up @@ -305,8 +305,8 @@ describe('CreateWorkflowModal', () => {
);
});

fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), { target: { value: 'newnamespace' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Name *' }), { target: { value: 'newname' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), { target: { value: 'newnamespace' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Workflow name *' }), { target: { value: 'newname' } });
fireEvent.change(screen.getByTestId('wdl editor'), { target: { value: 'workflow new {}' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Documentation' }), { target: { value: 'new docs' } });
fireEvent.change(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' }), {
Expand Down Expand Up @@ -356,8 +356,8 @@ describe('CreateWorkflowModal', () => {
});

// Assert
expect(screen.getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('testnamespace');
expect(screen.getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('testname');
expect(screen.getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('testnamespace');
expect(screen.getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue('testname');
expect(screen.getByTestId('wdl editor')).toHaveDisplayValue('workflow hi {}');
expect(screen.getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('test docs');
expect(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('test synopsis');
Expand Down Expand Up @@ -502,8 +502,10 @@ describe('CreateWorkflowModal', () => {
});

// Assert
expect(screen.getByRole('textbox', { name: 'Namespace *' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Name *' })).toHaveDisplayValue('groot-scientific-workflow_copy');
expect(screen.getByRole('textbox', { name: 'Collection name *' })).toHaveDisplayValue('');
expect(screen.getByRole('textbox', { name: 'Workflow name *' })).toHaveDisplayValue(
'groot-scientific-workflow_copy'
);
expect(screen.getByTestId('wdl editor')).toHaveDisplayValue('workflow do-great-stuff {}');
expect(screen.getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('I am Groot');
expect(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('I am Groot');
Expand All @@ -515,7 +517,7 @@ describe('CreateWorkflowModal', () => {
expect(cloneMethodButton).toHaveAttribute('aria-disabled', 'true');

// user enters value for 'Namespace' text box
fireEvent.change(screen.getByRole('textbox', { name: 'Namespace *' }), {
fireEvent.change(screen.getByRole('textbox', { name: 'Collection name *' }), {
target: { value: 'groot-test-namespace' },
});
// user enters value for 'Version comment' text box
Expand Down
15 changes: 8 additions & 7 deletions src/workflows/modals/CreateWorkflowModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ validate.validators.maxNamespaceNameCombinedLength = <OtherFieldName extends str
attributes: Record<OtherFieldName, string>
): string | null =>
value.length + attributes[options.otherField].length > 250
? '^Namespace and name are too long (maximum is 250 characters total)' // ^ character prevents attribute from being prepended
? '^Collection and workflow names are too long (maximum is 250 characters total)' // ^ character prevents attribute from being prepended
: null;

const createWorkflowModalConstraints = {
Expand All @@ -77,15 +77,15 @@ const createWorkflowModalConstraints = {
},
};

interface NamespaceNameSectionProps {
interface CollectionAndNameSectionProps {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make sense to also modify namespace to collection inside the interface as well? Also what does name refers to here, the collection name or the workflow name?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had intentionally decided to rename only user facing and component names to collection because we had made a decision in previous renaming efforts to only change high level component names and user-facing places to new terminology. It also wouldn't be trivial to update all the instances of namespace to collection everywhere in code. And even if we do change the variable names we would still need to refer these as namespace (and snapshot) whenever we are using the Ajax calls so that it can be consistent with backend terminology.

Having said that, I do understand that there might be some confusion when someone else comes and looks at the code. So I am open to the discussion on renaming what else what be good for developer readability.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha, in that case maybe a little comment in the code explaining that a namespace is the collection, and name is the workflow name?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can do that. I will also update the component name to be CollectionAndWfNameSection so it is more clear.

namespace: string | undefined;
name: string | undefined;
setWorkflowNamespace: (value: string) => void;
setWorkflowName: (value: string) => void;
errors: any;
}

const NamespaceNameSection = (props: NamespaceNameSectionProps) => {
const CollectionAndNameSection = (props: CollectionAndNameSectionProps) => {
const { namespace, name, setWorkflowNamespace, setWorkflowName, errors } = props;
const [namespaceModified, setNamespaceModified] = useState<boolean>(false);
const [nameModified, setNameModified] = useState<boolean>(false);
Expand All @@ -98,7 +98,7 @@ const NamespaceNameSection = (props: NamespaceNameSectionProps) => {
<div style={{ flexWrap: 'wrap', flexGrow: 1, flexBasis: '400px' }}>
<div style={{ marginBottom: '0.1667em' }}>
<FormLabel htmlFor={namespaceInputId} required>
Namespace
Collection name
</FormLabel>
<ValidatedInput
inputProps={{
Expand All @@ -117,7 +117,7 @@ const NamespaceNameSection = (props: NamespaceNameSectionProps) => {
<div style={{ flexWrap: 'wrap', flexGrow: 1, flexBasis: '400px' }}>
<div style={{ marginBottom: '0.1667em' }}>
<FormLabel htmlFor={nameInputId} required>
Name
Workflow name
</FormLabel>
<ValidatedInput
inputProps={{
Expand Down Expand Up @@ -165,7 +165,8 @@ export const CreateWorkflowModal = (props: CreateWorkflowModalProps) => {

const validationErrors = validate({ namespace, name, synopsis, wdl }, createWorkflowModalConstraints, {
prettify: (v) =>
({ namespace: 'Namespace', name: 'Name', synopsis: 'Synopsis', wdl: 'WDL' }[v] || validate.prettify(v)),
({ namespace: 'Collection name', name: 'Workflow name', synopsis: 'Synopsis', wdl: 'WDL' }[v] ||
validate.prettify(v)),
});

const onSubmitWorkflow = withBusyState(setBusy, async () => {
Expand All @@ -190,7 +191,7 @@ export const CreateWorkflowModal = (props: CreateWorkflowModalProps) => {
>
<div style={{ padding: '0.5rem 0' }}>
<div style={{ display: 'flex', alignItems: 'flex-end', flexWrap: 'wrap', gap: '16px' }}>
<NamespaceNameSection
<CollectionAndNameSection
namespace={namespace}
name={name}
setWorkflowNamespace={setNamespace}
Expand Down
8 changes: 4 additions & 4 deletions src/workflows/modals/EditWorkflowModal.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ describe('EditWorkflowModal', () => {

// Assert
expect(screen.getByText('Edit'));
expect(screen.getByRole('textbox', { name: 'Namespace' })).toHaveAttribute('placeholder', 'my-namespace');
expect(screen.getByRole('textbox', { name: 'Namespace' })).toHaveAttribute('disabled');
expect(screen.getByRole('textbox', { name: 'Name' })).toHaveAttribute('placeholder', 'my-workflow');
expect(screen.getByRole('textbox', { name: 'Name' })).toHaveAttribute('disabled');
expect(screen.getByRole('textbox', { name: 'Collection name' })).toHaveAttribute('placeholder', 'my-namespace');
expect(screen.getByRole('textbox', { name: 'Collection name' })).toHaveAttribute('disabled');
expect(screen.getByRole('textbox', { name: 'Workflow name' })).toHaveAttribute('placeholder', 'my-workflow');
expect(screen.getByRole('textbox', { name: 'Workflow name' })).toHaveAttribute('disabled');
expect(screen.getByTestId('wdl editor')).toHaveDisplayValue('workflow doStuff {}');
expect(screen.getByRole('textbox', { name: 'Documentation' })).toHaveDisplayValue('documentation');
expect(screen.getByRole('textbox', { name: 'Synopsis (80 characters max)' })).toHaveDisplayValue('synopsis');
Expand Down
Loading
Loading