## Description - Git mod integration with applications behind feature flag Fixes #37815 Fixes #37816 Fixes #37817 Fixes #37818 Fixes #37819 Fixes #37820 ## Automation /ok-to-test tags="@tag.All" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: <https://github.com/appsmithorg/appsmith/actions/runs/12526603607> > Commit: 19f3ca0a35b16b25b2cff8700e2df4b2a497e7fe > <a href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=12526603607&attempt=2" target="_blank">Cypress dashboard</a>. > Tags: `@tag.All` > Spec: > <hr>Sat, 28 Dec 2024 15:57:13 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced various new hooks for Git functionalities, including `useGitModEnabled`, `useGitCurrentBranch`, `useGitProtectedMode`, and `useGitConnected`. - Added a new component `DeployButton` to manage deployment actions. - Integrated `ConnectSuccessModal` to enhance user feedback upon successful Git connection. - Added `GitImportModal` for improved Git import functionality. - Introduced `GlobalProfileView` for managing and displaying user profile information. - Added a new icon, `CloudIconV2`, to the icon provider. - Implemented `fetchGlobalSSHKey` and `gitImport` sagas for better state management. - **Improvements** - Enhanced handling of Git-related states and actions across multiple components and sagas. - Streamlined selector usage for determining preview mode by replacing `combinedPreviewModeSelector` with `selectCombinedPreviewMode`. - Updated the `DeployPreview` component to manage success feedback and handle commit operations more effectively. - Improved the `StatusChangesView` component by adding a callout for migration messages. - Added new transformers for application status handling. - **Bug Fixes** - Updated error handling and loading states across various actions and components to improve reliability. - **Refactor** - Refactored action creators to use `createArtifactAction` instead of `createSingleArtifactAction` for consistency and clarity. - Consolidated Git import and connection logic to improve modularity and maintainability. - Modified the `Header` component to utilize `GitApplicationContextProvider` for managing Git-related state. - Updated various components to utilize the new `selectCombinedPreviewMode` selector for improved state management. - Refactored the `DeployPreview` component to enhance its functionality and styling consistency. - Enhanced the `applicationStatusTransformer` to handle multiple status transformations. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
115 lines
3.2 KiB
TypeScript
115 lines
3.2 KiB
TypeScript
import type { ReactElement } from "react";
|
|
import React from "react";
|
|
import type { RenderOptions } from "@testing-library/react";
|
|
import { render, queries } from "@testing-library/react";
|
|
import { Provider } from "react-redux";
|
|
import { ThemeProvider } from "styled-components";
|
|
import { getCurrentThemeDetails } from "selectors/themeSelectors";
|
|
import * as customQueries from "./customQueries";
|
|
import { BrowserRouter } from "react-router-dom";
|
|
import type { AppState } from "ee/reducers";
|
|
import appReducer from "ee/reducers";
|
|
import { applyMiddleware, compose, createStore } from "redux";
|
|
import { reduxBatch } from "@manaflair/redux-batch";
|
|
import createSagaMiddleware from "redux-saga";
|
|
import store, { testStore } from "store";
|
|
import { sagasToRunForTests } from "./sagas";
|
|
import { all, call, spawn } from "redux-saga/effects";
|
|
import type { FeatureFlags } from "ee/entities/FeatureFlag";
|
|
import { fetchFeatureFlagsSuccess } from "../src/actions/userActions";
|
|
import { DEFAULT_FEATURE_FLAG_VALUE } from "ee/entities/FeatureFlag";
|
|
|
|
const testSagaMiddleware = createSagaMiddleware();
|
|
|
|
const testStoreWithTestMiddleWare = (initialState: Partial<AppState>) =>
|
|
createStore(
|
|
appReducer,
|
|
initialState,
|
|
compose(reduxBatch, applyMiddleware(testSagaMiddleware), reduxBatch),
|
|
);
|
|
|
|
const rootSaga = function* (sagasToRun = sagasToRunForTests) {
|
|
yield all(
|
|
sagasToRun.map((saga) =>
|
|
spawn(function* () {
|
|
while (true) {
|
|
yield call(saga);
|
|
break;
|
|
}
|
|
}),
|
|
),
|
|
);
|
|
};
|
|
|
|
interface State {
|
|
url?: string;
|
|
initialState?: Partial<AppState>;
|
|
sagasToRun?: typeof sagasToRunForTests;
|
|
featureFlags?: Partial<FeatureFlags>;
|
|
}
|
|
const setupState = (state?: State) => {
|
|
let reduxStore = store;
|
|
|
|
window.history.pushState({}, "Appsmith", state?.url || "/");
|
|
|
|
if (state && (state.initialState || state.featureFlags)) {
|
|
reduxStore = testStore(state.initialState || {});
|
|
|
|
if (state.featureFlags) {
|
|
reduxStore.dispatch(
|
|
fetchFeatureFlagsSuccess({
|
|
...DEFAULT_FEATURE_FLAG_VALUE,
|
|
...state.featureFlags,
|
|
}),
|
|
);
|
|
}
|
|
}
|
|
|
|
if (state && state.sagasToRun) {
|
|
reduxStore = testStoreWithTestMiddleWare(reduxStore.getState());
|
|
testSagaMiddleware.run(() => rootSaga(state.sagasToRun));
|
|
}
|
|
|
|
const defaultTheme = getCurrentThemeDetails(reduxStore.getState());
|
|
|
|
return { reduxStore, defaultTheme };
|
|
};
|
|
|
|
const customRender = (
|
|
ui: ReactElement,
|
|
state?: State,
|
|
options?: Omit<RenderOptions, "queries">,
|
|
) => {
|
|
const { defaultTheme, reduxStore } = setupState(state);
|
|
|
|
return render(
|
|
<BrowserRouter>
|
|
<Provider store={reduxStore}>
|
|
<ThemeProvider theme={defaultTheme}>{ui}</ThemeProvider>
|
|
</Provider>
|
|
</BrowserRouter>,
|
|
{
|
|
queries: { ...queries, ...customQueries },
|
|
...options,
|
|
},
|
|
);
|
|
};
|
|
|
|
const hookWrapper = (state: State) => {
|
|
return ({ children }: { children: ReactElement }) => {
|
|
const { defaultTheme, reduxStore } = setupState(state);
|
|
|
|
return (
|
|
<BrowserRouter>
|
|
<Provider store={reduxStore}>
|
|
<ThemeProvider theme={defaultTheme}>{children}</ThemeProvider>
|
|
</Provider>
|
|
</BrowserRouter>
|
|
);
|
|
};
|
|
};
|
|
|
|
export * from "@testing-library/react";
|
|
|
|
export { customRender as render, hookWrapper };
|