diff --git a/qa-core/src/config/internal-api/TestConfiguration/applications.ts b/qa-core/src/config/internal-api/TestConfiguration/applications.ts index 1cfd025974..aac82df013 100644 --- a/qa-core/src/config/internal-api/TestConfiguration/applications.ts +++ b/qa-core/src/config/internal-api/TestConfiguration/applications.ts @@ -117,7 +117,7 @@ export default class AppApi { return [response, json] } - async update( + async rename( appId: string, oldName: string, body: any @@ -153,4 +153,27 @@ export default class AppApi { expect(response).toHaveStatusCode(204) return [response] } + + async unlock(appId: string): Promise<[Response, responseMessage]> { + const response = await this.api.del(`/dev/${appId}/lock`) + const json = await response.json() + expect(response).toHaveStatusCode(200) + expect(json.message).toEqual("Lock released successfully.") + return [response, json] + } + + async updateIcon(appId: string): Promise<[Response, Application]> { + const body = { + icon: { + name: "ConversionFunnel", + color: "var(--spectrum-global-color-red-400)", + }, + } + const response = await this.api.put(`/applications/${appId}`, { body }) + const json = await response.json() + expect(response).toHaveStatusCode(200) + expect(json.icon.name).toEqual(body.icon.name) + expect(json.icon.color).toEqual(body.icon.color) + return [response, json] + } } diff --git a/qa-core/src/config/internal-api/TestConfiguration/rows.ts b/qa-core/src/config/internal-api/TestConfiguration/rows.ts index 39ba01f467..7269807f56 100644 --- a/qa-core/src/config/internal-api/TestConfiguration/rows.ts +++ b/qa-core/src/config/internal-api/TestConfiguration/rows.ts @@ -15,7 +15,7 @@ export default class RowsApi { const json = await response.json() if (this.rowAdded) { expect(response).toHaveStatusCode(200) - expect(json.length).toEqual(1) + expect(json.length).toBeGreaterThanOrEqual(1) } return [response, json] } @@ -36,4 +36,27 @@ export default class RowsApi { expect(response).toHaveStatusCode(200) return [response, json] } + + async searchNoPagination( + tableId: string, + body: any + ): Promise<[Response, Row[]]> { + const response = await this.api.post(`/${tableId}/search`, { body }) + const json = await response.json() + expect(response).toHaveStatusCode(200) + expect(json.hasNextPage).toEqual(false) + return [response, json.rows] + } + + async searchWithPagination( + tableId: string, + body: any + ): Promise<[Response, Row[]]> { + const response = await this.api.post(`/${tableId}/search`, { body }) + const json = await response.json() + expect(response).toHaveStatusCode(200) + expect(json.hasNextPage).toEqual(true) + expect(json.rows.length).toEqual(10) + return [response, json.rows] + } } diff --git a/qa-core/src/config/internal-api/fixtures/rows.ts b/qa-core/src/config/internal-api/fixtures/rows.ts index 90f6350dcf..f1f1c00493 100644 --- a/qa-core/src/config/internal-api/fixtures/rows.ts +++ b/qa-core/src/config/internal-api/fixtures/rows.ts @@ -6,3 +6,27 @@ export const generateNewRowForTable = (tableId: string): Row => { tableId: tableId, } } + +export const searchBody = (primaryDisplay: string): any => { + return { + bookmark: null, + limit: 10, + paginate: true, + query: { + contains: {}, + containsAny: {}, + empty: {}, + equal: {}, + fuzzy: {}, + notContains: {}, + notEmpty: {}, + notEqual: {}, + oneOf: {}, + range: {}, + string: {}, + }, + sort: primaryDisplay, + sortOrder: "ascending", + sortType: "string", + } +} diff --git a/qa-core/src/tests/internal-api/applications/applications.spec.ts b/qa-core/src/tests/internal-api/applications/applications.spec.ts index 70724232bb..e7692740b8 100644 --- a/qa-core/src/tests/internal-api/applications/applications.spec.ts +++ b/qa-core/src/tests/internal-api/applications/applications.spec.ts @@ -69,7 +69,7 @@ describe("Internal API - Application creation, update, publish and delete", () = await config.applications.unpublish(app.appId) }) - it("POST - Sync application before deployment", async () => { + it("Sync application before deployment", async () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId @@ -81,7 +81,7 @@ describe("Internal API - Application creation, update, publish and delete", () = }) }) - it("POST - Sync application after deployment", async () => { + it("Sync application after deployment", async () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId @@ -96,24 +96,32 @@ describe("Internal API - Application creation, update, publish and delete", () = }) }) - it("PUT - Update an application", async () => { + it("Rename an application", async () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId - await config.applications.update(app.appId, app.name, { + await config.applications.rename(app.appId, app.name, { name: generator.word(), }) }) - it("POST - Revert Changes without changes", async () => { + it("Update the icon and color of an application", async () => { + const app = await config.applications.create(generateApp()) + + config.applications.api.appId = app.appId + + await config.applications.updateIcon(app.appId) + }) + + it("Revert Changes without changes", async () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId await config.applications.revertUnpublished(app.appId) }) - it("POST - Revert Changes", async () => { + it("Revert Changes", async () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId @@ -126,11 +134,12 @@ describe("Internal API - Application creation, update, publish and delete", () = // // Revert the app to published state await config.applications.revertPublished(app.appId) + await config.applications.unlock(app.appId) // Check screen is removed await config.applications.getRoutes() }) - it("DELETE - Delete an application", async () => { + it("Delete an application", async () => { const app = await config.applications.create(generateApp()) await config.applications.delete(app.appId) diff --git a/qa-core/src/tests/internal-api/screens/screens.spec.ts b/qa-core/src/tests/internal-api/screens/screens.spec.ts index 06d2115af4..ee3e97afc6 100644 --- a/qa-core/src/tests/internal-api/screens/screens.spec.ts +++ b/qa-core/src/tests/internal-api/screens/screens.spec.ts @@ -21,7 +21,7 @@ describe("Internal API - /screens endpoints", () => { await config.afterAll() }) - it("POST - Create a screen with each role type", async () => { + it("Create a screen with each role type", async () => { // Create app const app = await appConfig.applications.create(generateApp()) @@ -35,7 +35,7 @@ describe("Internal API - /screens endpoints", () => { } }) - it("GET - Fetch screens", async () => { + it("Get screens", async () => { // Create app const app = await appConfig.applications.create(generateApp()) @@ -47,7 +47,7 @@ describe("Internal API - /screens endpoints", () => { await appConfig.applications.getRoutes(true) }) - it("DELETE - Delete a screen", async () => { + it("Delete a screen", async () => { // Create app const app = await appConfig.applications.create(generateApp()) diff --git a/qa-core/src/tests/internal-api/tables/tables.spec.ts b/qa-core/src/tests/internal-api/tables/tables.spec.ts index 6b2d2240e5..7d79330304 100644 --- a/qa-core/src/tests/internal-api/tables/tables.spec.ts +++ b/qa-core/src/tests/internal-api/tables/tables.spec.ts @@ -6,9 +6,12 @@ import { generateTable, generateNewColumnForTable, } from "../../../config/internal-api/fixtures/table" -import { generateNewRowForTable } from "../../../config/internal-api/fixtures/rows" +import { + generateNewRowForTable, + searchBody, +} from "../../../config/internal-api/fixtures/rows" -describe("Internal API - Application creation, update, publish and delete", () => { +describe("Internal API - Table Operations", () => { const api = new InternalAPIClient() const config = new TestConfiguration(api) @@ -31,7 +34,7 @@ describe("Internal API - Application creation, update, publish and delete", () = }) } - it("Operations on Tables", async () => { + it("Create and delete table, columns and rows", async () => { // create the app const appName = generator.word() const app = await createAppFromTemplate() @@ -86,4 +89,70 @@ describe("Internal API - Application creation, update, publish and delete", () = //Table was deleted await config.tables.getAll(2) }) + + it("Search and pagination", async () => { + // create the app + const appName = generator.word() + const app = await createAppFromTemplate() + config.applications.api.appId = app.appId + + // Get current tables: expect 2 in this template + await config.tables.getAll(2) + + // Add new table + const [createdTableResponse, createdTableData] = await config.tables.save( + generateTable() + ) + + //Table was added + await config.tables.getAll(3) + + //Get information about the table + await config.tables.getTableById(createdTableData._id) + + //Add Column to table + const newColumn = generateNewColumnForTable(createdTableData) + const [addColumnResponse, addColumnData] = await config.tables.save( + newColumn, + true + ) + + //Add Row to table + let newRow = generateNewRowForTable(addColumnData._id) + await config.rows.add(addColumnData._id, newRow) + + //Search single row + await config.rows.searchNoPagination( + createdTableData._id, + searchBody(createdTableData.primaryDisplay) + ) + + //Add 10 more rows + for (let i = 0; i < 10; i++) { + let newRow = generateNewRowForTable(addColumnData._id) + await config.rows.add(addColumnData._id, newRow) + } + + //Search rows with pagination + const [allRowsResponse, allRowsJson] = + await config.rows.searchWithPagination( + createdTableData._id, + searchBody(createdTableData.primaryDisplay) + ) + + //Delete Rows from table + const rowToDelete = { + rows: [allRowsJson], + } + const [deleteRowResponse, deleteRowData] = await config.rows.delete( + createdTableData._id, + rowToDelete + ) + + //Search single row + await config.rows.searchWithPagination( + createdTableData._id, + searchBody(createdTableData.primaryDisplay) + ) + }) }) diff --git a/qa-core/src/tests/internal-api/userManagement/appSpecificRoles.spec.ts b/qa-core/src/tests/internal-api/userManagement/appSpecificRoles.spec.ts index 502ce3d767..53ae78f42d 100644 --- a/qa-core/src/tests/internal-api/userManagement/appSpecificRoles.spec.ts +++ b/qa-core/src/tests/internal-api/userManagement/appSpecificRoles.spec.ts @@ -28,9 +28,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { }) it("Add BASIC user to app", async () => { + // Create a user with BASIC role and check if it was created successfully const appUser = generateUser() expect(appUser[0].builder?.global).toEqual(false) expect(appUser[0].admin?.global).toEqual(false) + + // Add the user to the tenant. const [createUserResponse, createUserJson] = await config.users.addMultiple( appUser ) @@ -38,9 +41,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { const app = await config.applications.create(appFromTemplate()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -49,6 +55,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() @@ -56,6 +63,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { }) it("Add ADMIN user to app", async () => { + // Create a user with ADMIN role and check if it was created successfully const adminUser = generateUser(1, "admin") expect(adminUser[0].builder?.global).toEqual(true) expect(adminUser[0].admin?.global).toEqual(true) @@ -63,15 +71,15 @@ describe("Internal API - App Specific Roles & Permissions", () => { adminUser ) - //const app = await config.applications.create(generateApp()) - //config.applications.api.appId = app.appId - const app = await config.applications.create(appFromTemplate()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -80,6 +88,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() @@ -93,9 +102,9 @@ describe("Internal API - App Specific Roles & Permissions", () => { }) it("Add POWER user to app", async () => { + // Create a user with POWER role and check if it was created successfully const powerUser = generateUser(1, "developer") expect(powerUser[0].builder?.global).toEqual(true) - const [createUserResponse, createUserJson] = await config.users.addMultiple( powerUser ) @@ -103,9 +112,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -114,6 +126,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() @@ -122,6 +135,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { describe("Check Access for default roles", () => { it("Check Table access for app user", async () => { + // Create a user with BASIC role and check if it was created successfully const appUser = generateUser() expect(appUser[0].builder?.global).toEqual(false) expect(appUser[0].admin?.global).toEqual(false) @@ -131,9 +145,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -142,14 +159,18 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() expect(changedUserInfoJson.roles[app.appId]).toEqual("BASIC") + // Create a table const [createdTableResponse, createdTableData] = await config.tables.save( generateTable() ) + + // Login with the user created and try to create a column await config.login(appUser[0].email, appUser[0].password) const newColumn = generateNewColumnForTable(createdTableData) await config.tables.forbiddenSave(newColumn) @@ -157,6 +178,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { }) it("Check Table access for developer", async () => { + // Create a user with POWER role and check if it was created successfully const developer = generateUser(1, "developer") expect(developer[0].builder?.global).toEqual(true) @@ -166,9 +188,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -177,14 +202,18 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() expect(changedUserInfoJson.roles[app.appId]).toEqual("POWER") + // Create a table const [createdTableResponse, createdTableData] = await config.tables.save( generateTable() ) + + // Login with the user created and try to create a column await config.login( developer[0].email, developer[0].password @@ -197,6 +226,7 @@ describe("Internal API - App Specific Roles & Permissions", () => { }) it("Check Table access for admin", async () => { + // Create a user with ADMIN role and check if it was created successfully const adminUser = generateUser(1, "admin") expect(adminUser[0].builder?.global).toEqual(true) expect(adminUser[0].admin?.global).toEqual(true) @@ -206,9 +236,12 @@ describe("Internal API - App Specific Roles & Permissions", () => { const app = await config.applications.create(generateApp()) config.applications.api.appId = app.appId + // Get all the information from the create user const [userInfoResponse, userInfoJson] = await config.users.getInfo( createUserJson.created.successful[0]._id ) + + // Create the body with the information from the user and add the role to the app const body: User = { ...userInfoJson, roles: { @@ -217,11 +250,13 @@ describe("Internal API - App Specific Roles & Permissions", () => { } await config.users.updateInfo(body) + // Get the user information again and check if the role was added const [changedUserInfoResponse, changedUserInfoJson] = await config.users.getInfo(createUserJson.created.successful[0]._id) expect(changedUserInfoJson.roles[app.appId]).toBeDefined() expect(changedUserInfoJson.roles[app.appId]).toEqual("ADMIN") + // Login with the created user and create a table await config.login( adminUser[0].email, adminUser[0].password diff --git a/qa-core/src/tests/internal-api/userManagement/userManagement.spec.ts b/qa-core/src/tests/internal-api/userManagement/userManagement.spec.ts index ea235d7cc7..fb61d5070f 100644 --- a/qa-core/src/tests/internal-api/userManagement/userManagement.spec.ts +++ b/qa-core/src/tests/internal-api/userManagement/userManagement.spec.ts @@ -18,9 +18,13 @@ describe("Internal API - User Management & Permissions", () => { }) it("Add Users with different roles", async () => { + // Get all users await config.users.search() + + // Get all roles await config.users.getRoles() + // Add users with each role const admin = generateUser(1, "admin") expect(admin[0].builder?.global).toEqual(true) expect(admin[0].admin?.global).toEqual(true) @@ -34,6 +38,7 @@ describe("Internal API - User Management & Permissions", () => { await config.users.addMultiple(userList) + // Check users are added const [allUsersResponse, allUsersJson] = await config.users.getAll() expect(allUsersJson.length).toBeGreaterThan(0) })