diff --git a/app/client/cypress.config.ts b/app/client/cypress.config.ts index 3d988077426f..8644b4967192 100644 --- a/app/client/cypress.config.ts +++ b/app/client/cypress.config.ts @@ -7,6 +7,8 @@ export default defineConfig({ responseTimeout: 60000, pageLoadTimeout: 60000, video: true, + videosFolder: "cypress/videos", + videoCompression: 32, numTestsKeptInMemory: 5, experimentalMemoryManagement: true, reporterOptions: { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Templates/forkTemplateUsingReduxStore_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Templates/forkTemplateUsingReduxStore_spec.js new file mode 100644 index 000000000000..61ed3ad28838 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/Templates/forkTemplateUsingReduxStore_spec.js @@ -0,0 +1,69 @@ +import widgetLocators from "../../../../locators/Widgets.json"; +import template from "../../../../locators/TemplatesLocators.json"; +import { + agHelper, + locators, + templates, +} from "../../../../support/Objects/ObjectsCore"; +import EditorNavigation, { + EntityType, +} from "../../../../support/Pages/EditorNavigation"; +import PageList from "../../../../support/Pages/PageList"; + +beforeEach(() => { + cy.get("body").then(($ele) => { + if ($ele.find(template.templateDialogBox).length) { + cy.xpath(template.closeButton).click({ force: true }); + } + }); + EditorNavigation.SelectEntityByName("Page1", EntityType.Page); +}); + +describe( + "Fork a template to the current aplication using Redux store", + { tags: ["@tag.Templates", "@tag.excludeForAirgap"] }, + () => { + it("Fork template from page section", () => { + + PageList.AddNewPage("Add page from template"); + agHelper.AssertElementExist(template.templateDialogBox); + agHelper.AssertElementVisibility(template.templateDialogBox); + agHelper.AssertElementVisibility(templates.locators._templateCard); + agHelper.AssertElementVisibility(template.vehicleMaintenenceApp); + agHelper.GetNClick(template.vehicleMaintenenceApp); + + agHelper.AssertElementAbsence( + "//*[text()='Loading template details']", + Cypress.config().pageLoadTimeout, + ); + + agHelper.FailIfErrorToast( + "Internal server error while processing request", + ); + + cy.get("body").then(($ele) => { + if ($ele.find(widgetLocators.toastAction).length <= 0) { + if ($ele.find(template.templateViewForkButton).length > 0) { + cy.get(template.templateViewForkButton).click(); + } + } + }); + + + agHelper.AssertElementAbsence( + locators._visibleTextSpan("Setting up the template"), + Cypress.config().pageLoadTimeout, + ); + + + agHelper.ValidateToastMessage("template added successfully"); + agHelper.AssertElementVisibility(locators._itemContainerWidget); + agHelper.WaitUntilAllToastsDisappear(); + + const vehicleMaintenenceAppTemplateId=defaultAppState.ui.templates.templates[4].id + const endpoint = `/api/v1/app-templates/${vehicleMaintenenceAppTemplateId}`; + cy.intercept('GET', endpoint).as('fetchTemplateDetails'); + cy.get('@fetchTemplateDetails.all').should('have.length', 0); + }); + }, +); diff --git a/app/client/src/api/TemplatesApi.ts b/app/client/src/api/TemplatesApi.ts index d7750e89a7cf..7309895ca06d 100644 --- a/app/client/src/api/TemplatesApi.ts +++ b/app/client/src/api/TemplatesApi.ts @@ -1,12 +1,14 @@ -import type { AxiosPromise } from "axios"; -import Api from "api/Api"; -import type { ApiResponse } from "./ApiResponses"; -import type { WidgetType } from "constants/WidgetConstants"; import type { - ApplicationResponsePayload, ApplicationPagePayload, + ApplicationResponsePayload, } from "@appsmith/api/ApplicationApi"; +import Api from "api/Api"; +import type { AxiosPromise } from "axios"; +import type { WidgetType } from "constants/WidgetConstants"; import type { Datasource } from "entities/Datasource"; +import { getTemplatesSelector } from "selectors/templatesSelectors"; +import store from "store"; +import type { ApiResponse } from "./ApiResponses"; export interface Template { id: string; @@ -27,6 +29,8 @@ export interface Template { } export type FetchTemplatesResponse = ApiResponse; +export type TemplatesResponse = Template; + export type FilterKeys = "widgets" | "datasources"; export type FetchTemplateResponse = ApiResponse