* test: Added tests for expression panels, #3498 * Cosmetic changes, renaming tests * Refactored unique expressions used in tests
This commit is contained in:
parent
23be710f2c
commit
a5db3774f9
@ -0,0 +1,313 @@
|
||||
/**
|
||||
* Utility method to load an expression panel, used by almost all the tests
|
||||
*/
|
||||
function loadExpressionPanel() {
|
||||
cy.columnActionClick('Shrt_Desc', ['Facet', 'Custom text facet'])
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to fill something into the expression input
|
||||
* Need to wait for OpenRefine to preview the result, hence the cy.wait
|
||||
*/
|
||||
function typeExpression(expression) {
|
||||
cy.get('textarea.expression-preview-code').type(expression)
|
||||
cy.wait(250)
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a unique GREL expression to be used for testing
|
||||
*/
|
||||
function generateUniqueExpression() {
|
||||
return `value+${Date.now()}`
|
||||
}
|
||||
|
||||
describe(__filename, function () {
|
||||
it('Test the layout of the expression panel', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
|
||||
cy.get('.dialog-container').within(() => {
|
||||
cy.get('td[bind="or_dialog_expr"]').contains('Expression')
|
||||
cy.get(
|
||||
'select[bind="expressionPreviewLanguageSelect"] option'
|
||||
).should('have.length', 3)
|
||||
cy.get('textarea.expression-preview-code').should('exist')
|
||||
|
||||
cy.get('.dialog-footer button:nth-child(1)').should(
|
||||
'to.contain',
|
||||
'OK'
|
||||
)
|
||||
cy.get('.dialog-footer button:nth-child(2)').should(
|
||||
'to.contain',
|
||||
'Cancel'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
it('Test a valid Grel expression', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
typeExpression('value.toLowercase()')
|
||||
cy.get('.expression-preview-parsing-status').contains(
|
||||
'No syntax error.'
|
||||
)
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'butter,with salt')
|
||||
})
|
||||
|
||||
it('Test a valid Python expression', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'jython'
|
||||
)
|
||||
typeExpression('return value.lower()')
|
||||
cy.get('.expression-preview-parsing-status').contains(
|
||||
'No syntax error.'
|
||||
)
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'butter,with salt')
|
||||
})
|
||||
|
||||
it('Test a valid Clojure expression', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'clojure'
|
||||
)
|
||||
typeExpression('(.. value (toLowerCase) )')
|
||||
cy.get('.expression-preview-parsing-status').contains(
|
||||
'No syntax error.'
|
||||
)
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'butter,with salt')
|
||||
})
|
||||
|
||||
it('Test a Grel syntax error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
typeExpression('()')
|
||||
cy.get('.expression-preview-parsing-status').contains('Parsing error')
|
||||
})
|
||||
|
||||
it('Test a Python syntax error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'jython'
|
||||
)
|
||||
typeExpression('(;)')
|
||||
cy.get('.expression-preview-parsing-status').contains('Internal error')
|
||||
})
|
||||
|
||||
it('Test a Clojure syntax error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'clojure'
|
||||
)
|
||||
typeExpression('(;)')
|
||||
cy.get('.expression-preview-parsing-status').contains(
|
||||
'Syntax error reading source'
|
||||
)
|
||||
})
|
||||
|
||||
it('Test a Grel language error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
typeExpression('value.thisGrelFunctionDoesNotExists()')
|
||||
cy.get('.expression-preview-parsing-status').contains(
|
||||
'Unknown function thisGrelFunctionDoesNotExists'
|
||||
)
|
||||
})
|
||||
|
||||
it('Test a Python language error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'jython'
|
||||
)
|
||||
typeExpression('return value.thisPythonFunctionDoesNotExists()')
|
||||
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'Error: Traceback')
|
||||
})
|
||||
|
||||
it('Test a Clojure language error', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'clojure'
|
||||
)
|
||||
typeExpression('(.. value (thisClojureFunctionDoesNotExists) )')
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'Error: No matching method')
|
||||
})
|
||||
|
||||
it('Test switching from one langage to another', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
typeExpression('(.. value (toLowerCase) )')
|
||||
// error is expected, this is clojure language
|
||||
cy.get('.expression-preview-parsing-status').should(
|
||||
'to.contain',
|
||||
'Parsing error'
|
||||
)
|
||||
// switching to clojure
|
||||
cy.get('select[bind="expressionPreviewLanguageSelect"]').select(
|
||||
'clojure'
|
||||
)
|
||||
cy.get('.expression-preview-parsing-status').should(
|
||||
'not.to.contain',
|
||||
'Parsing error'
|
||||
)
|
||||
})
|
||||
|
||||
it('Test the preview (GREL)', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
typeExpression('value.toLowercase()')
|
||||
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(1) td:last-child'
|
||||
).should('to.contain', 'value.toLowercase()')
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(2) td:last-child'
|
||||
).should('to.contain', 'butter,with salt')
|
||||
cy.get(
|
||||
'.expression-preview-table-wrapper tr:nth-child(3) td:last-child'
|
||||
).should('to.contain', 'butter,whipped,with salt')
|
||||
})
|
||||
|
||||
it('Test the help tab', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('#expression-preview-tabs li').contains('Help').click()
|
||||
cy.get('#expression-preview-tabs-help').should('be.visible')
|
||||
cy.get('#expression-preview-tabs-help').should(
|
||||
'to.contain',
|
||||
`The current cell. It has a few fields: 'value', 'recon' and 'errorMessage'.`
|
||||
)
|
||||
})
|
||||
|
||||
it('Test the history behavior, ensure expressions are stored', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
// Because history is shared across projects, we need to use an expression that is unique
|
||||
|
||||
// Use a first unique expression
|
||||
const uniqueExpression = generateUniqueExpression()
|
||||
loadExpressionPanel()
|
||||
typeExpression(uniqueExpression)
|
||||
cy.get('.dialog-footer button').contains('OK').click()
|
||||
// ensure the function has been added to the facet
|
||||
cy.get('#refine-tabs-facets').contains(
|
||||
uniqueExpression.replace('()', '')
|
||||
)
|
||||
|
||||
// Reload and review history
|
||||
// Ensure the previously used expression is listed
|
||||
loadExpressionPanel()
|
||||
cy.get('#expression-preview-tabs li').contains('History').click()
|
||||
cy.get('#expression-preview-tabs-history')
|
||||
.should('be.visible')
|
||||
.should('to.contain', uniqueExpression)
|
||||
})
|
||||
|
||||
it('Test the reuse of expressions from the history', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
// Because history is shared across projects, we need to build and use an expression that is unique
|
||||
const uniqueExpression = generateUniqueExpression()
|
||||
loadExpressionPanel()
|
||||
typeExpression(uniqueExpression)
|
||||
cy.get('.dialog-footer button').contains('OK').click()
|
||||
cy.get('#refine-tabs-facets').contains(
|
||||
uniqueExpression.replace('()', '')
|
||||
)
|
||||
|
||||
// Reload and review history
|
||||
// Ensure the previously used expression is there
|
||||
// Use it
|
||||
loadExpressionPanel()
|
||||
cy.get('#expression-preview-tabs li').contains('History').click()
|
||||
cy.get('#expression-preview-tabs-history tr td')
|
||||
.contains(uniqueExpression)
|
||||
.parent()
|
||||
.find('a')
|
||||
.contains('Reuse')
|
||||
.click()
|
||||
|
||||
// Expression must be populated in the textarea, after clicking on 'reuse'
|
||||
cy.get('textarea.expression-preview-code').should(
|
||||
'have.value',
|
||||
uniqueExpression
|
||||
)
|
||||
})
|
||||
|
||||
it('Test the history, star', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
|
||||
// Cleanup step
|
||||
// Because starred expression are shared across projects, see #3499
|
||||
// We need to un-star all previously starred expressions
|
||||
loadExpressionPanel()
|
||||
cy.get('#expression-preview-tabs li').contains('Starred').click()
|
||||
cy.get(
|
||||
'#expression-preview-tabs-starred .expression-preview-table-wrapper table'
|
||||
).then(($table) => {
|
||||
if ($table.find('tr').length > 1) {
|
||||
cy.get(
|
||||
'#expression-preview-tabs-starred .expression-preview-table-wrapper table a'
|
||||
)
|
||||
.contains('Remove')
|
||||
.each(($btn) => {
|
||||
cy.wrap($btn).click()
|
||||
cy.get('.dialog-container:last-child button')
|
||||
.contains('OK')
|
||||
.click()
|
||||
})
|
||||
}
|
||||
})
|
||||
cy.get('.dialog-footer button').contains('Cancel').click()
|
||||
// End cleanup
|
||||
|
||||
// Load an expression
|
||||
loadExpressionPanel()
|
||||
const uniqueExpression = generateUniqueExpression()
|
||||
typeExpression(uniqueExpression)
|
||||
cy.get('.dialog-footer button').contains('OK').click()
|
||||
|
||||
// Star the expression
|
||||
loadExpressionPanel()
|
||||
cy.get('#expression-preview-tabs li').contains('History').click()
|
||||
cy.get('.expression-preview-table-wrapper tr td')
|
||||
.contains(uniqueExpression)
|
||||
.parent()
|
||||
.find('a.data-table-star-off')
|
||||
.click()
|
||||
|
||||
// List starred expressions, en ensure the expression is listed
|
||||
cy.get('#expression-preview-tabs li').contains('Starred').click()
|
||||
cy.get(
|
||||
'#expression-preview-tabs-starred .expression-preview-table-wrapper table'
|
||||
).contains(uniqueExpression)
|
||||
})
|
||||
|
||||
it('Simple test to ensure the expression panel can be closed with OK', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('.dialog-footer button').contains('OK').click()
|
||||
cy.get('.dialog-container').should('not.to.exist')
|
||||
})
|
||||
|
||||
it('Simple test to ensure the expression panel can be closed with Cancel', function () {
|
||||
cy.loadAndVisitProject('food.mini')
|
||||
loadExpressionPanel()
|
||||
cy.get('.dialog-footer button').contains('Cancel').click()
|
||||
cy.get('.dialog-container').should('not.to.exist')
|
||||
})
|
||||
})
|
Loading…
Reference in New Issue
Block a user