Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C436782 #3337

Merged
merged 4 commits into from
Mar 15, 2024
Merged

C436782 #3337

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
import permissions from '../../../support/dictionary/permissions';
import BulkEditSearchPane from '../../../support/fragments/bulk-edit/bulk-edit-search-pane';
import TopMenu from '../../../support/fragments/topMenu';
import Users from '../../../support/fragments/users/users';
import QueryModal, {
usersFieldValues,
dateTimeOperators,
stringOperators,
} from '../../../support/fragments/bulk-edit/query-modal';
import DateTools from '../../../support/utils/dateTools';

let user;

describe('Bulk Edit - Query', () => {
before('create test data', () => {
cy.getAdminToken();
cy.createTempUser([
permissions.bulkEditUpdateRecords.gui,
permissions.uiUserEdit.gui,
permissions.bulkEditQueryView.gui,
]).then((userProperties) => {
user = userProperties;
cy.getUsers({ limit: 1, query: `username=${user.username}` }).then((users) => {
cy.updateUser({
...users[0],
expirationDate: DateTools.getTomorrowDay(),
});
});
cy.login(user.username, user.password, {
path: TopMenu.bulkEditPath,
waiter: BulkEditSearchPane.waitLoading,
});
});
});

after('delete test data', () => {
cy.getAdminToken();
Users.deleteViaApi(user.userId);
});

it(
'C436782 Query builder - Search users with expiration date in specified date range and first name, last name containing specific letters ("Date-time" and "String" property types) (firebird)',
{ tags: ['smoke', 'firebird'] },
() => {
BulkEditSearchPane.openQuerySearch();
BulkEditSearchPane.checkUsersRadio();
BulkEditSearchPane.clickBuildQueryButton();
QueryModal.verify();
QueryModal.verifyFieldsSortedAlphabetically();
QueryModal.selectField(usersFieldValues.expirationDate);
QueryModal.verifySelectedField(usersFieldValues.expirationDate);
QueryModal.verifyQueryAreaContent('(user_expiration_date )');
QueryModal.verifyOperatorColumn();
QueryModal.selectOperator('>=');
QueryModal.verifyOperatorsList(dateTimeOperators);
QueryModal.verifyQueryAreaContent('(user_expiration_date >= )');
QueryModal.verifyValueColumn();
const todayDate = DateTools.getCurrentDate();
const todayDateWithDashes = DateTools.getCurrentDateForFiscalYear();
QueryModal.pickDate(todayDate);
QueryModal.testQueryDisabled(false);
QueryModal.runQueryDisabled();
QueryModal.addNewRow();
QueryModal.verifyBooleanColumn();
QueryModal.verifyEmptyField(1);
QueryModal.verifyEmptyOperator(1);
QueryModal.verifyEmptyValue(1);
QueryModal.verifyPlusAndTrashButtonsDisabled(1, false, false);
QueryModal.verifyPlusAndTrashButtonsDisabled(0, false, true);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND ( )`,
);
QueryModal.testQueryDisabled();
QueryModal.runQueryDisabled();
QueryModal.typeInAndSelectField(usersFieldValues.expirationDate, 1);
QueryModal.selectOperator('<=', 1);
QueryModal.verifyValueColumn();
const nextWeekDate = DateTools.get2DaysAfterTomorrowDateForFiscalYearOnUIEdit();
const nextWeekDateWithDashes = DateTools.getSomeDaysAfterTomorrowDateForFiscalYear(3);
QueryModal.pickDate(nextWeekDate, 1);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND (user_expiration_date <= "${nextWeekDateWithDashes}")`,
);
QueryModal.testQueryDisabled(false);
QueryModal.runQueryDisabled();
QueryModal.addNewRow(1);
QueryModal.verifyBooleanColumn(2);
QueryModal.verifyEmptyField(2);
QueryModal.verifyEmptyOperator(2);
QueryModal.verifyEmptyValue(2);
QueryModal.verifyPlusAndTrashButtonsDisabled(0, false, true);
QueryModal.testQueryDisabled();
QueryModal.runQueryDisabled();
QueryModal.selectField(usersFieldValues.lastName, 2);
QueryModal.verifySelectedField(usersFieldValues.lastName, 2);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND (user_expiration_date <= "${nextWeekDateWithDashes}") AND (user_last_name )`,
);
QueryModal.testQueryDisabled();
QueryModal.runQueryDisabled();
QueryModal.selectOperator('starts with', 2);
QueryModal.verifyOperatorsList(stringOperators, 2);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND (user_expiration_date <= "${nextWeekDateWithDashes}") AND (user_last_name starts with )`,
);
QueryModal.fillInValueTextfield('cypressTestUser', 2);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND (user_expiration_date <= "${nextWeekDateWithDashes}") AND (user_last_name starts with "cypressTestUser")`,
);
QueryModal.testQueryDisabled(false);
QueryModal.runQueryDisabled();
QueryModal.addNewRow(2);
QueryModal.verifyBooleanColumn(3);
QueryModal.verifyEmptyField(3);
QueryModal.verifyEmptyOperator(3);
QueryModal.verifyEmptyValue(3);
QueryModal.verifyPlusAndTrashButtonsDisabled(0, false, true);
QueryModal.testQueryDisabled();
QueryModal.runQueryDisabled();
QueryModal.selectField(usersFieldValues.firstName, 3);
QueryModal.verifySelectedField(usersFieldValues.firstName, 3);
QueryModal.testQueryDisabled();
QueryModal.runQueryDisabled();
QueryModal.selectOperator('contains', 3);
QueryModal.fillInValueTextfield('testPermFirst', 3);
QueryModal.verifyQueryAreaContent(
`(user_expiration_date >= "${todayDateWithDashes}") AND (user_expiration_date <= "${nextWeekDateWithDashes}") AND (user_last_name starts with "cypressTestUser") AND (user_first_name contains "testPermFirst")`,
);
QueryModal.testQueryDisabled(false);
QueryModal.runQueryDisabled();
QueryModal.clickTestQuery();
QueryModal.verifyPreviewOfRecordsMatched();
QueryModal.clickRunQuery();
QueryModal.verifyClosed();
BulkEditSearchPane.verifySpecificTabHighlighted('Query');
},
);
});
5 changes: 0 additions & 5 deletions cypress/support/fragments/bulk-edit/bulk-edit-search-pane.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ const errorsCommittingBtn = DropdownMenu().find(
Button('File with errors encountered when committing the changes'),
);
const buildQueryButton = Button('Build query');
const buildQueryModal = Modal('Build query');
const logsActionButton = Button({ icon: 'ellipsis' });

const newCheckbox = Checkbox('New');
Expand Down Expand Up @@ -1249,10 +1248,6 @@ export default {
cy.do(buildQueryButton.click());
},

verifyBuildQueryModal() {
cy.expect(buildQueryModal.exists());
},

verifyFirstOptionRecordIdentifierDropdown(value) {
cy.expect(recordIdentifierDropdown.has({ checkedOptionText: value }));
},
Expand Down
221 changes: 221 additions & 0 deletions cypress/support/fragments/bulk-edit/query-modal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
import {
Button,
HTML,
Keyboard,
Modal,
MultiColumnList,
RepeatableFieldItem,
Select,
Selection,
Spinner,
TextField,
including,
} from '../../../../interactors';

const buildQueryModal = Modal('Build query');
const testQueryButton = Button('Test query');
const cancelButton = Button('Cancel');
const runQueryButton = Button('Run query');
const xButton = Button({ icon: 'times' });
const plusButton = Button({ icon: 'plus-sign' });
const trashButton = Button({ icon: 'trash' });

const booleanValues = ['AND'];
export const usersFieldValues = {
expirationDate: 'User expiration date',
firstName: 'User first name',
lastName: 'User last name',
};
export const dateTimeOperators = [
'Select operator',
'==',
'!=',
'>',
'<',
'>=',
'<=',
'is null/empty',
];
export const stringOperators = [
'Select operator',
'==',
'!=',
'contains',
'starts with',
'is null/empty',
];

export default {
verify(firstline = true) {
cy.expect([
buildQueryModal.exists(),
testQueryButton.has({ disabled: true }),
cancelButton.has({ disabled: false }),
runQueryButton.has({ disabled: true }),
xButton.has({ disabled: false }),
]);
this.verifyModalContent(firstline);
},

verifyModalContent(firstline) {
cy.get('[class^="headline"]').contains('Query');
cy.get('[class^="queryArea"]').should('exist');
cy.get('[class^="col-sm-4"][class*="headerCell"]').should('have.text', 'Field');
cy.get('[class^="col-sm-1"][class*="headerCell"]').should('have.text', 'Actions');
this.verifyEmptyField();
cy.get('[class^="col-sm-1-"] [icon="plus-sign"]:not([disabled])');
cy.get(`[class^="col-sm-1-"] [icon="trash"]${firstline ? '[disabled]' : ':not([disabled])'}`);
},

verifyEmptyField(row = 0) {
cy.get(
`[data-testid="row-${row}"] [class^="col-sm-4"] [class^="selectionControl"] [class^="singleValue"]`,
).should('have.text', 'Select field');
},

verifyEmptyOperator(row = 0) {
cy.get(`[data-testid="row-${row}"] [class^="col-sm-2"]`).children().should('not.exist');
},

verifyEmptyValue(row = 0) {
cy.get(`[data-testid="row-${row}"] [class^="col-sm-4"]`).eq(1).children().should('not.exist');
},

verifyFieldsSortedAlphabetically() {
cy.get('[class^="col-sm-4"] [role="listbox"] [role="option"]')
.children()
.then((optionsText) => {
const textArray = optionsText.get().map((el) => el.innerText);
const sortedArray = [...textArray].sort((a, b) => a - b);
expect(sortedArray).to.eql(textArray);
});
},

selectField(selection, row = 0) {
cy.do(RepeatableFieldItem({ index: row }).find(Selection()).choose(selection));
},

typeInAndSelectField(string, row = 0) {
cy.do([
RepeatableFieldItem({ index: row }).find(Selection()).open(),
RepeatableFieldItem({ index: row }).find(Selection()).filterOptions(string),
cy.wait(1000),
Keyboard.enter(),
]);
},

verifySelectedField(selection, row = 0) {
cy.get(
`[data-testid="row-${row}"] [class^="col-sm-4"] [class^="selectionControl"] [class^="singleValue"]`,
).should('have.text', selection);
},

verifyOperatorColumn() {
cy.get('[class^="col-sm-2"][class*="headerCell"]').should('have.text', 'Operator');
cy.get(
'[class^="col-sm-2"] [class^="selectControl"] option:contains("Select operator"):disabled',
);
},

selectOperator(selection, row = 0) {
cy.do(
RepeatableFieldItem({ index: row })
.find(Select({ dataTestID: including('operator-option') }))
.choose(selection),
);
},

verifyOperatorsList(operators, row = 0) {
cy.get(`[data-testid="row-${row}"] [class^="col-sm-2"] [class^="selectControl"] option`).then(
(options) => {
const textArray = options.get().map((el) => el.label);
expect(textArray).to.eql(operators);
},
);
},

verifyQueryAreaContent(content) {
cy.get('[class^="queryArea"]').should('have.text', content);
},

verifyValueColumn() {
cy.get('[class^="col-sm-4"][class*="headerCell"]').contains('Value');
},

pickDate(date, row = 0) {
cy.get(`[data-testid="row-${row}"] [class^="col-sm-4"] [placeholder="MM/DD/YYYY"]`).should(
'exist',
);
cy.get(`[data-testid="row-${row}"] [class^="col-sm-4"] [icon="calendar"]`).should('exist');
cy.do(RepeatableFieldItem({ index: row }).find(TextField()).fillIn(date));
},

fillInValueTextfield(text, row = 0) {
cy.do(RepeatableFieldItem({ index: row }).find(TextField()).fillIn(text));
},

cancelDisabled(disabled = true) {
cancelButton.has({ disabled });
},

testQueryDisabled(disabled = true) {
cy.expect(testQueryButton.has({ disabled }));
},

runQueryDisabled(disabled = true) {
cy.expect(runQueryButton.has({ disabled }));
},

addNewRow(row = 0) {
cy.do(RepeatableFieldItem({ index: row }).find(plusButton).click());
},

verifyBooleanColumn(row = 1) {
cy.get('[class^="col-sm-1"][class*="headerCell"]').contains('Boolean');
cy.get(`[data-testid="row-${row}"] [class^="col-sm-1"] [class^="selectControl"]`)
.find('option')
.should('have.length', 1)
.and('have.text', ...booleanValues);
},

verifyPlusAndTrashButtonsDisabled(row = 0, plusDisabled = true, trashDisabled = true) {
cy.expect([
RepeatableFieldItem({ index: row }).find(plusButton).has({ disabled: plusDisabled }),
RepeatableFieldItem({ index: row }).find(trashButton).has({ disabled: trashDisabled }),
]);
},

clickTestQuery() {
cy.do(testQueryButton.click());
cy.expect([HTML('Test query in progress').exists(), Spinner().exists()]);
this.runQueryDisabled();
this.cancelDisabled(false);
},

verifyPreviewOfRecordsMatched() {
cy.expect([MultiColumnList().exists(), Button('Show columns').exists()]);
this.testQueryDisabled(false);
this.cancelDisabled(false);
this.runQueryDisabled(false);
cy.get('[class^="col-xs-10"]').then(($element) => {
cy.wrap($element)
.invoke('text')
.then((text) => {
const [totalRecords, previewRecords] = text.match(/\d+/g).map(Number);
const previewLabel = `Preview of first ${Math.min(previewRecords, 100)} records.`;
expect(text.startsWith(`Query would return ${totalRecords} records.`)).to.equal(true);
expect(previewLabel).to.equal(
`Preview of first ${Math.min(previewRecords, 100)} records.`,
);
});
});
},

clickRunQuery() {
cy.do(runQueryButton.click());
},

verifyClosed() {
cy.do(buildQueryModal.absent());
},
};
Loading