diff --git a/src/components/incident/test/IncidentDetails.test.tsx b/src/components/incident/test/IncidentDetails.test.tsx
index 7fc001d7..90760034 100644
--- a/src/components/incident/test/IncidentDetails.test.tsx
+++ b/src/components/incident/test/IncidentDetails.test.tsx
@@ -1,7 +1,7 @@
/** * @jest-environment jsdom */
import React from "react";
-import {render, screen, waitFor, within} from "@testing-library/react";
+import {render, screen, waitFor, waitForElementToBeRemoved, within} from "@testing-library/react";
import IncidentDetails from "../IncidentDetails";
import {Incident, IncidentTag, IncidentTicketUrlBody, SourceSystem} from "../../../api/types";
@@ -319,6 +319,136 @@ describe('Incident Details: Create Ticket button',() => {
// Create ticket endpoint was not called
expect(createTicketSpy).toHaveBeenCalledTimes(0);
});
+
+ it("should not display spinner within create ticket button by default in the incident details view", async () => {
+ await waitFor(() => {
+ render(
+
+ )
+ });
+
+ // Create ticket button is rendered
+ const createTicketButton = screen.getByRole('button', {name: /create ticket/i});
+ expect(createTicketButton).toBeInTheDocument();
+
+ // Spinner is not present within create ticket button
+ expect(within(createTicketButton).queryByRole('progressbar')).not.toBeInTheDocument();
+ });
+
+ it("should display spinner within create ticket button after user confirms create ticket action in the dialog", async () => {
+ await waitFor(() => {
+ render(
+
+ )
+ });
+
+ // User clicks on the Create Ticket button
+ const createTicketButton = screen.getByRole('button', {name: /create ticket/i});
+ userEvent.click(createTicketButton);
+
+ // User confirms create ticket action in the dialog
+ const dialogSubmitButton = screen.getByRole('button', {name: /yes/i});
+ expect(dialogSubmitButton).toBeInTheDocument();
+ userEvent.click(dialogSubmitButton);
+
+ // Spinner appears within create ticket button
+ const createTicketProgress = within(createTicketButton).getByRole('progressbar');
+ expect(createTicketProgress).toBeInTheDocument();
+ });
+
+ it("should not display spinner within create ticket button after user cancels create ticket action in the dialog", async () => {
+ await waitFor(() => {
+ render(
+
+ )
+ });
+
+ // User clicks on the Create Ticket button
+ const createTicketButton = screen.getByRole('button', {name: /create ticket/i});
+ userEvent.click(createTicketButton);
+
+ // User cancels create ticket action in the dialog
+ const dialogCancelButton = screen.getByRole('button', {name: /no/i});
+ expect(dialogCancelButton).toBeInTheDocument();
+ userEvent.click(dialogCancelButton);
+
+ // Spinner is not present within create ticket button
+ expect(within(createTicketButton).queryByRole('progressbar')).not.toBeInTheDocument();
+ });
+
+ it("should stop displaying spinner within create ticket button after error on create ticket operation", async () => {
+ createTicketSpy.mockRejectedValue(new Error("Create ticket test error"));
+
+ await waitFor(() => {
+ render(
+
+ )
+ });
+
+ // User clicks on the Create Ticket button
+ const createTicketButton = screen.getByRole('button', {name: /create ticket/i});
+ userEvent.click(createTicketButton);
+
+ // User confirms create ticket action
+ const dialogSubmitButton = screen.getByRole('button', {name: /yes/i});
+ expect(dialogSubmitButton).toBeInTheDocument();
+ userEvent.click(dialogSubmitButton);
+
+ // Spinner appears within create ticket button
+ const createTicketProgress = within(createTicketButton).getByRole('progressbar');
+ expect(createTicketProgress).toBeInTheDocument();
+
+ // Create ticket endpoint was called with correct incident pk
+ expect(createTicketSpy).toHaveBeenCalledTimes(1)
+ expect(createTicketSpy).toHaveBeenCalledWith(4000)
+
+ // Spinner within create ticket button disappears
+ await waitForElementToBeRemoved(createTicketProgress);
+ });
+
+ it("should stop displaying spinner within create ticket button after success on create ticket operation", async () => {
+ await waitFor(() => {
+ render(
+
+ )
+ });
+
+ // User clicks on the Create Ticket button
+ const createTicketButton = screen.getByRole('button', {name: /create ticket/i});
+ userEvent.click(createTicketButton);
+
+ // User confirms create ticket action
+ const dialogSubmitButton = screen.getByRole('button', {name: /yes/i});
+ expect(dialogSubmitButton).toBeInTheDocument();
+ userEvent.click(dialogSubmitButton);
+
+ // Spinner appears within create ticket button
+ const createTicketProgress = within(createTicketButton).getByRole('progressbar');
+ expect(createTicketProgress).toBeInTheDocument();
+
+ // Create ticket endpoint was called with correct incident pk
+ expect(createTicketSpy).toHaveBeenCalledTimes(1)
+ expect(createTicketSpy).toHaveBeenCalledWith(4000)
+ expect(createTicketSpy).toHaveReturnedWith(Promise.resolve({ticket_url: generatedTicketUrlMockValue}))
+
+ // Spinner within create ticket button disappears
+ await waitForElementToBeRemoved(createTicketProgress);
+ });
});
describe('Primary Details section: Source internal incident ID',() => {