fix(HMS-3704): hiding blueprint out of sync alert

This commit is contained in:
Amir 2024-03-04 17:00:33 +02:00 committed by Lucas Garfield
parent e97291759c
commit 97b7aa6bfd
4 changed files with 99 additions and 21 deletions

View file

@ -89,6 +89,7 @@ const ImagesTable = ({ selectedBlueprint }: ImageTableProps) => {
data: blueprintsComposes,
isSuccess: isBlueprintsSuccess,
isLoading: isLoadingBlueprintsCompose,
isFetching: isFetchingBlueprintsCompose,
isError: isBlueprintsError,
} = useGetBlueprintComposesQuery(
{
@ -126,6 +127,8 @@ const ImagesTable = ({ selectedBlueprint }: ImageTableProps) => {
: isLoadingComposes;
const isBlueprintOutSync =
selectedBlueprint &&
!isFetchingBlueprintsCompose &&
blueprintsComposes?.data[0]?.blueprint_version !== selectedBlueprintVersion;
if (isLoading) {
@ -199,7 +202,7 @@ const ImagesTable = ({ selectedBlueprint }: ImageTableProps) => {
<Th />
</Tr>
</Thead>
{itemCount === 0 && (
{itemCount === 0 ? (
<Tbody>
<Tr>
<Td colSpan={12}>
@ -207,19 +210,21 @@ const ImagesTable = ({ selectedBlueprint }: ImageTableProps) => {
</Td>
</Tr>
</Tbody>
)}
{experimentalFlag && isBlueprintOutSync && (
<Tbody>
<Tr>
<Td colSpan={12}>
<Alert
isInline
title="You haven't built new images for this version of your blueprint yet"
ouiaId="blueprint-out-of-sync-alert"
/>
</Td>
</Tr>
</Tbody>
) : (
experimentalFlag &&
isBlueprintOutSync && (
<Tbody>
<Tr>
<Td colSpan={12}>
<Alert
isInline
title="You haven't built new images for this version of your blueprint yet"
ouiaId="blueprint-out-of-sync-alert"
/>
</Td>
</Tr>
</Tbody>
)
)}
{composes?.map((compose, rowIndex) => {

View file

@ -38,6 +38,7 @@ describe('Blueprints', () => {
const blueprintIdWithComposes = '677b010b-e95e-4694-9813-d11d847f1bfc';
const blueprintNameEmptyComposes = 'Milk Chocolate';
const blueprintIdEmptyComposes = '193482e4-4bd0-4898-a8bc-dc8c33ed669f';
const blueprintIdOutOfSync = '51243667-8d87-4aef-8dd1-84fc58261b05';
test('renders blueprints page', async () => {
renderWithReduxRouter('', {});
@ -72,8 +73,9 @@ describe('Blueprints', () => {
await user.click(elementById);
const table = await screen.findByTestId('images-table');
const { findByText } = within(table);
await findByText(blueprintNameWithComposes);
const { findAllByText } = within(table);
const images = await findAllByText(blueprintNameWithComposes);
expect(images).toHaveLength(2);
});
test('renders blueprint composes empty state', async () => {
renderWithReduxRouter('', {});
@ -112,6 +114,34 @@ describe('Blueprints', () => {
expect(buildImageBtn).toBeEnabled();
});
test('blueprint is out of sync', async () => {
renderWithReduxRouter('', {});
const nameMatcher = (_, element) =>
element.getAttribute('name') === 'blueprints';
const radioButtons = await screen.findAllByRole('radio', {
name: nameMatcher,
});
const outSyncBlueprintCard = radioButtons.find(
(button) => button.getAttribute('id') === blueprintIdOutOfSync
);
await user.click(outSyncBlueprintCard);
await screen.findByText(
"You haven't built new images for this version of your blueprint yet"
);
const blueprintWithComposes = radioButtons.find(
(button) => button.getAttribute('id') === blueprintIdWithComposes
);
await user.click(blueprintWithComposes);
expect(
screen.queryByText(
"You haven't built new images for this version of your blueprint yet"
)
).not.toBeInTheDocument();
});
describe('edit blueprint', () => {
const editedBlueprintName = 'Dark Chocolate';
const routes = [

View file

@ -14,7 +14,7 @@ export const mockBlueprintsCreation: CreateBlueprintResponse[] = [
export const mockGetBlueprints: GetBlueprintsApiResponse = {
links: { first: 'first', last: 'last' },
meta: { count: 2 },
meta: { count: 3 },
data: [
{
id: '677b010b-e95e-4694-9813-d11d847f1bfc',
@ -30,6 +30,13 @@ export const mockGetBlueprints: GetBlueprintsApiResponse = {
version: 1,
last_modified_at: '2021-09-08T14:38:00.000Z',
},
{
id: '51243667-8d87-4aef-8dd1-84fc58261b05',
name: 'Lemon Pie',
description: 'Crusted lemon pie with meringue topping',
version: 2,
last_modified_at: '2021-09-08T14:38:00.000Z',
},
],
};
@ -39,6 +46,34 @@ export const emptyGetBlueprints: GetBlueprintsApiResponse = {
data: [],
};
export const mockBlueprintComposesOutOfSync: GetBlueprintComposesApiResponse = {
meta: { count: 1 },
data: [
{
id: 'edbae1c2-62bc-42c1-ae0c-3110ab718f58',
image_name: 'Lemon Pie',
created_at: '2021-09-08T14:38:00.000Z',
blueprint_version: 1,
request: {
distribution: RHEL_9,
image_requests: [
{
architecture: 'x86_64',
image_type: 'aws',
upload_request: {
type: 'aws',
options: {
share_with_accounts: ['123123123123'],
},
},
},
],
},
},
],
links: { first: 'first', last: 'last' },
};
export const mockBlueprintComposes: GetBlueprintComposesApiResponse = {
meta: { count: 2 },
data: [
@ -65,6 +100,7 @@ export const mockBlueprintComposes: GetBlueprintComposesApiResponse = {
},
{
id: 'c1cfa347-4c37-49b5-8e73-6aa1d1746cfa',
image_name: 'Dark Chocolate',
created_at: '2021-04-27T12:31:12Z',
blueprint_version: 1,
request: {

View file

@ -14,6 +14,7 @@ import {
import { mockArchitecturesByDistro } from '../fixtures/architectures';
import {
mockBlueprintComposes,
mockBlueprintComposesOutOfSync,
mockBlueprintDetail,
mockEmptyBlueprintsComposes,
mockGetBlueprints,
@ -148,11 +149,17 @@ export const handlers = [
rest.get(
`${IMAGE_BUILDER_API}/experimental/blueprints/:id/composes`,
(req, res, ctx) => {
const MilkChocolateBlueprint = mockGetBlueprints.data[1].id;
if (req.params.id === MilkChocolateBlueprint) {
return res(ctx.status(200), ctx.json(mockEmptyBlueprintsComposes));
const emptyBlueprintId = mockGetBlueprints.data[1].id;
const outOfSyncBlueprintId = mockGetBlueprints.data[2].id;
switch (req.params.id) {
case emptyBlueprintId:
return res(ctx.status(200), ctx.json(mockEmptyBlueprintsComposes));
case outOfSyncBlueprintId:
return res(ctx.status(200), ctx.json(mockBlueprintComposesOutOfSync));
default:
return res(ctx.status(200), ctx.json(mockBlueprintComposes));
}
return res(ctx.status(200), ctx.json(mockBlueprintComposes));
}
),
rest.get(