Skip to content

Commit

Permalink
Merge branch 'release' of github.com:appsmithorg/appsmith into chore/…
Browse files Browse the repository at this point in the history
…git-mod-10
  • Loading branch information
brayn003 committed Jan 1, 2025
2 parents d1412df + 463c119 commit 7d2f1a7
Show file tree
Hide file tree
Showing 66 changed files with 34,874 additions and 432 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/pr-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ jobs:
shell: bash
outputs:
tags: ${{ steps.parseTags.outputs.tags }}
its: ${{ steps.parseTags.outputs.its }}
spec: ${{ steps.parseTags.outputs.spec }}
matrix: ${{ steps.checkAll.outputs.matrix }}
steps:
Expand Down Expand Up @@ -129,6 +130,7 @@ jobs:
uses: ./.github/workflows/pr-cypress.yml
secrets: inherit
with:
its: ${{ needs.parse-tags.outputs.its}}
tags: ${{ needs.parse-tags.outputs.tags}}
spec: ${{ needs.parse-tags.outputs.spec}}
matrix: ${{ needs.parse-tags.outputs.matrix}}
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/pr-cypress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ name: Cypress test suite
on:
workflow_call:
inputs:
its:
required: false
type: string
default: "false"
tags:
required: true
type: string
Expand Down Expand Up @@ -45,6 +49,15 @@ jobs:
with:
pr: ${{ github.event.number }}

server-it:
needs: [ server-build, rts-build ]
if: success() && inputs.its == 'true'
uses: ./.github/workflows/server-integration-tests.yml
secrets: inherit
with:
pr: ${{ github.event.number }}
is-pg-build: ${{ github.event.pull_request.base.ref == 'pg' }}

build-docker-image:
needs: [client-build, server-build, rts-build]
# Only run if the build step is successful
Expand All @@ -69,7 +82,7 @@ jobs:
matrix: ${{ inputs.matrix }}

ci-test-result:
needs: [ci-test]
needs: [ci-test, server-it]
# Only run if the ci-test with matrices step is successful
if: always()
runs-on: ubuntu-latest
Expand Down
32 changes: 22 additions & 10 deletions .github/workflows/scripts/test-tag-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,37 @@ module.exports = function ({core, context, github}) {
}

core.setOutput("tags", parseResult.tags ?? "");
core.setOutput("its", parseResult.its ?? "");
core.setOutput("spec", parseResult.spec ?? "");
}

function parseTags(body) {
const allTags = require(process.env.GITHUB_WORKSPACE + "/app/client/cypress/tags.js").Tag;

// "/ok-to-test" matcher. Takes precedence over the "/test" matcher.
const strictMatch = body.match(/^\/ok-to-test tags="(.+?)"/m)?.[1];
if (strictMatch) {
if (strictMatch === "@tag.All") {
return { tags: strictMatch };
}
const parts = strictMatch.split(/\s*,\s*/);
for (const part of parts) {
if (!allTags.includes(part)) {
throw new Error("Unknown tag: " + part);
const okToTestPattern = body.match(/^(\/ok-to-test) tags="(.+?)"( it=true)?/m);

if (okToTestPattern?.[1]) {
var response = {};
const tagsMatch = okToTestPattern?.[2];
if (tagsMatch) {
if (tagsMatch === "@tag.All") {
response = { tags: tagsMatch };
} else {
const parts = tagsMatch.split(/\s*,\s*/);
for (const part of parts) {
if (!allTags.includes(part)) {
throw new Error("Unknown tag: " + part);
}
}
response = { tags: tagsMatch };
}
}
return { tags: strictMatch };
const itsMatch = okToTestPattern?.[3];
if (itsMatch) {
response = { ...response, its: 'true' };
}
return response;
}

// "/test" code-fence matcher.
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/server-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@ on:
workflow_call:
inputs:
pr:
description: "This is the PR number in case the workflow is being called in a pull request"
description: "PR number for the workflow"
required: false
type: number
skip-tests:
description: "This is a boolean value in case the workflow is being called in build deploy-preview"
description: "Skip tests flag"
required: false
type: string
default: "false"
branch:
description: "This is the branch to be used for the build."
description: "Branch for the build"
required: false
type: string
is-pg-build:
description: "This is a boolean value in case the workflow is being called for a PG build"
description: "Flag for PG build"
required: false
type: string
default: "false"
Expand Down Expand Up @@ -210,6 +210,7 @@ jobs:
fi
args=()
if [[ "${{ steps.run_result.outputs.run_result }}" == "failedtest" ]]; then
failed_tests="${{ steps.failed_tests.outputs.tests }}"
args+=("-DfailIfNoTests=false" "-Dsurefire.failIfNoSpecifiedTests=false" "-Dtest=${failed_tests}")
Expand Down
108 changes: 108 additions & 0 deletions .github/workflows/server-integration-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: Server Integrations Tests Workflow

on:
# This line enables manual triggering of this workflow.
workflow_dispatch:
workflow_call:
inputs:
pr:
description: "This is the PR number in case the workflow is being called in a pull request"
required: false
type: number
is-pg-build:
description: "Flag for PG build"
required: false
type: string
default: "false"

jobs:
run-tests:
runs-on: ubuntu-latest-8-cores
if: |
github.event.pull_request.head.repo.full_name == github.repository ||
github.event_name == 'workflow_dispatch'
defaults:
run:
shell: bash
# Service containers to run with this job. Required for running tests
services:
# Label used to access the service container
redis:
# Docker Hub image for Redis
image: redis
ports:
# Opens tcp port 6379 on the host and service container
- 6379:6379

steps:
# Check out merge commit
- name: Fork based /ok-to-test checkout
if: inputs.pr != 0
uses: actions/checkout@v4
with:
ref: "refs/pull/${{ inputs.pr }}/merge"

# Checkout the code in the current branch in case the workflow is called because of a branch push event
- name: Checkout the head commit of the branch
if: inputs.pr == 0
uses: actions/checkout@v4

# Setup Java
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "17"

- name: Conditionally start PostgreSQL
if: |
inputs.is-pg-build == 'true'
run: |
docker run --name appsmith-pg -p 5432:5432 -d -e POSTGRES_PASSWORD=password postgres:alpine postgres -N 1500
- name: Download the server build artifact
uses: actions/download-artifact@v4
with:
name: server-build
path: app/server/dist/

- name: Download the rts build artifact
uses: actions/download-artifact@v4
with:
name: rts-dist
path: app/client/packages/rts/dist

- name: Un-tar the rts folder
run: |
tar -xvf app/client/packages/rts/dist/rts-dist.tar -C app/client/packages/rts/
echo "Cleaning up the rts tar files"
rm app/client/packages/rts/dist/rts-dist.tar
- name: Run rts using the untarred files
run: |
nohup -- node app/client/packages/rts/dist/bundle/server.js &
- name: Run only integration tests on server
env:
ACTIVE_PROFILE: test
APPSMITH_CLOUD_SERVICES_BASE_URL: "https://release-cs.appsmith.com"
APPSMITH_CLOUD_SERVICES_TEMPLATE_UPLOAD_AUTH: ${{ secrets.APPSMITH_CLOUD_SERVICES_TEMPLATE_UPLOAD_AUTH }}
APPSMITH_REDIS_URL: "redis://127.0.0.1:6379"
APPSMITH_ENCRYPTION_PASSWORD: "password"
APPSMITH_ENCRYPTION_SALT: "salt"
APPSMITH_ENVFILE_PATH: /tmp/dummy.env
APPSMITH_VERBOSE_LOGGING_ENABLED: false
run: |
if [[ "${{ inputs.is-pg-build }}" == "true" ]]; then
export APPSMITH_DB_URL="postgresql://postgres:password@localhost:5432/postgres"
else
export APPSMITH_DB_URL="mongodb://localhost:27017/mobtools"
fi
args=()
# Run tests and capture logs
cd app/server
mvn verify -DskipUTs=true "${args[@]}" | tee mvn_integration_test.log
Original file line number Diff line number Diff line change
Expand Up @@ -206,29 +206,33 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () {
.then(($text) => expect($text).to.eq("Appsmith"));
});

it("11. Verify all admin setting sections are accessible", () => {
cy.visit("/applications", { timeout: 60000 });
agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn);
cy.wait("@getEnvVariables");
agHelper.GetNClick(adminsSettings.generalTab);
agHelper.AssertURL(adminSettingsHelper.routes.GENERAL);
agHelper.GetNClick(adminsSettings.advancedTab);
agHelper.AssertURL(adminSettingsHelper.routes.ADVANCED);
agHelper.GetNClick(adminsSettings.authenticationTab);
agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION);
agHelper.GetNClick(adminsSettings.emailTab);
agHelper.AssertURL(adminSettingsHelper.routes.EMAIL);
agHelper.GetNClick(adminsSettings.developerSettingsTab);
agHelper.AssertURL(adminSettingsHelper.routes.DEVELOPER_SETTINGS);
agHelper.GetNClick(adminsSettings.versionTab);
agHelper.AssertURL(adminSettingsHelper.routes.VERSION);
agHelper.GetNClick(adminsSettings.branding);
agHelper.AssertURL(adminSettingsHelper.routes.BRANDING);
agHelper.GetNClick(adminsSettings.provisioning);
agHelper.AssertURL(adminSettingsHelper.routes.PROVISIONING);
agHelper.GetNClick(adminsSettings.accessControl);
agHelper.AssertURL(adminSettingsHelper.routes.ACCESS_CONTROL);
agHelper.GetNClick(adminsSettings.auditLogs);
agHelper.AssertURL(adminSettingsHelper.routes.AUDIT_LOGS);
});
it(
"11. Verify all admin setting sections are accessible",
{ tags: ["@tag.excludeForAirgap"] },
() => {
cy.visit("/applications", { timeout: 60000 });
agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn);
cy.wait("@getEnvVariables");
agHelper.GetNClick(adminsSettings.generalTab);
agHelper.AssertURL(adminSettingsHelper.routes.GENERAL);
agHelper.GetNClick(adminsSettings.advancedTab);
agHelper.AssertURL(adminSettingsHelper.routes.ADVANCED);
agHelper.GetNClick(adminsSettings.authenticationTab);
agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION);
agHelper.GetNClick(adminsSettings.emailTab);
agHelper.AssertURL(adminSettingsHelper.routes.EMAIL);
agHelper.GetNClick(adminsSettings.developerSettingsTab);
agHelper.AssertURL(adminSettingsHelper.routes.DEVELOPER_SETTINGS);
agHelper.GetNClick(adminsSettings.versionTab);
agHelper.AssertURL(adminSettingsHelper.routes.VERSION);
agHelper.GetNClick(adminsSettings.branding);
agHelper.AssertURL(adminSettingsHelper.routes.BRANDING);
agHelper.GetNClick(adminsSettings.provisioning);
agHelper.AssertURL(adminSettingsHelper.routes.PROVISIONING);
agHelper.GetNClick(adminsSettings.accessControl);
agHelper.AssertURL(adminSettingsHelper.routes.ACCESS_CONTROL);
agHelper.GetNClick(adminsSettings.auditLogs);
agHelper.AssertURL(adminSettingsHelper.routes.AUDIT_LOGS);
},
);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {
agHelper,
assertHelper,
entityExplorer,
homePage,
jsEditor,
locators,
} from "../../../../support/Objects/ObjectsCore";
import HomePage from "../../../../locators/HomePage";
import {
PageLeftPane,
PagePaneSegment,
} from "../../../../support/Pages/EditorNavigation";

describe("Fork application with Jsobjects", {}, function () {
//https://github.com/appsmithorg/appsmith/issues/36277
it("1. Fork app and verify all the elements", () => {
homePage.ImportApp("jsObjectTesting.json");
agHelper.GetNClick(homePage._applicationName);
agHelper.GetNClickByContains;
agHelper.GetNClickByContains(
HomePage.applicationEditMenu,
"Fork application",
);
agHelper.GetNClick(locators._forkAppToWorkspaceBtn);
agHelper.FailIfErrorToast("");
assertHelper.AssertNetworkStatus("@postForkAppWorkspace", 200);
agHelper.WaitUntilEleDisappear(homePage._forkModal);
homePage.NavigateToHome();
agHelper.AssertElementExist(
`${homePage._applicationCard}:contains('JS object testing upto 1.5 MB (1)')`,
);
homePage.EditAppFromAppHover("JS object testing upto 1.5 MB (1)");
PageLeftPane.switchSegment(PagePaneSegment.JS);
for (let i = 1; i <= 11; i++) {
agHelper.GetNClick(locators._entityTestId(`JS${i}`));
agHelper.FailIfErrorToast("");
agHelper.AssertClassExists(locators._entityTestId(`JS${i}`), "active");
}
for (let i = 12; i <= 17; i++) {
agHelper.GetNClick(locators._entityTestId(`J${i}`));
agHelper.FailIfErrorToast("");
agHelper.AssertClassExists(locators._entityTestId(`J${i}`), "active");
}

jsEditor.CreateJSObject('"MiddleName": "Test",\n', {
paste: false,
toRun: false,
completeReplace: false,
shouldCreateNewJSObj: false,
lineNumber: 5,
});
agHelper.GetNClick(locators._entityTestId("J16"));
agHelper.AssertClassExists(locators._entityTestId("J16"), "active");
agHelper.GetNClick(locators._entityTestId("J17"));
agHelper.AssertClassExists(locators._entityTestId("J17"), "active");
agHelper.GetNAssertContains(".CodeMirror-line ", '"MiddleName": "Test"');
});
});
Loading

0 comments on commit 7d2f1a7

Please sign in to comment.