@ -38,6 +38,11 @@ const widgetFull = fromAccess(AccessLevel.full);
// Holds widgets manifest content.
let widgets : ICustomWidget [ ] = [ ] ;
// Helper function to get iframe with custom widget.
function getCustomWidgetFrame() {
return driver . findWait ( 'iframe' , 500 ) ;
}
describe ( 'CustomWidgets' , function ( ) {
this . timeout ( 20000 ) ;
const cleanup = setupTestSuite ( ) ;
@ -50,6 +55,8 @@ describe('CustomWidgets', function () {
return server . testingHooks . setWidgetRepositoryUrl ( url ? ` ${ widgetServerUrl } ${ url } ` : '' ) ;
}
before ( async function ( ) {
if ( server . isExternalServer ( ) ) {
this . skip ( ) ;
@ -100,8 +107,14 @@ describe('CustomWidgets', function () {
// Add custom section.
await gu . addNewSection ( /Custom/ , /Table1/ , { selectBy : /TABLE1/ } ) ;
// Override gristConfig to enable widget list.
await driver . executeScript ( 'window.gristConfig.enableWidgetRepository = true;' ) ;
} ) ;
after ( async function ( ) {
await server . testingHooks . setWidgetRepositoryUrl ( '' ) ;
} ) ;
after ( async function ( ) {
await server . testingHooks . setWidgetRepositoryUrl ( '' ) ;
} ) ;
after ( async function ( ) {
@ -109,7 +122,7 @@ describe('CustomWidgets', function () {
} ) ;
// Open or close widget menu.
const toggle = ( ) = > driver . find ( '.test-config-widget-select .test-select-open' ) . click ( ) ;
const toggle = async ( ) = > await driver . find Wait ( '.test-config-widget-select .test-select-open' , 1000 ) . click ( ) ;
// Get current value from widget menu.
const current = ( ) = > driver . find ( '.test-config-widget-select .test-select-open' ) . getText ( ) ;
// Get options from widget menu (must be first opened).
@ -121,19 +134,17 @@ describe('CustomWidgets', function () {
} ;
// Get rendered content from custom section.
const content = async ( ) = > {
const iframe = driver . find ( 'iframe' ) ;
await driver . switchTo ( ) . frame ( iframe ) ;
return gu . doInIframe ( await getCustomWidgetFrame ( ) , async ( ) = > {
const text = await driver . find ( 'body' ) . getText ( ) ;
await driver . switchTo ( ) . defaultContent ( ) ;
return text ;
} ) ;
} ;
async function execute (
op : ( table : TableOperations ) = > Promise < any > ,
tableSelector : ( grist : any ) = > TableOperations = ( grist ) = > grist . selectedTable
) {
const iframe = await driver . find ( 'iframe' ) ;
await driver . switchTo ( ) . frame ( iframe ) ;
try {
return gu . doInIframe ( await getCustomWidgetFrame ( ) , async ( ) = > {
const harness = async ( done : any ) = > {
const grist = ( window as any ) . grist ;
grist . ready ( ) ;
@ -157,9 +168,7 @@ describe('CustomWidgets', function () {
const result = await driver . executeAsyncScript ( cmd ) ;
// done callback will return null instead of undefined
return result === "__undefined__" ? undefined : result ;
} finally {
await driver . switchTo ( ) . defaultContent ( ) ;
}
} ) ;
}
// Replace url for the Custom URL widget.
const setUrl = async ( url : string ) = > {
@ -206,6 +215,17 @@ describe('CustomWidgets', function () {
// Rejects new access level.
const reject = ( ) = > driver . find ( ".test-config-widget-access-reject" ) . click ( ) ;
describe ( 'RightWidgetMenu' , ( ) = > {
beforeEach ( async function ( ) {
// Override gristConfig to enable widget list.
await driver . executeScript ( 'window.gristConfig.enableWidgetRepository = true;' ) ;
// We need to be sure that widget configuration panel is open all the time.
await gu . toggleSidePanel ( 'right' , 'open' ) ;
await recreatePanel ( ) ;
await driver . findWait ( '.test-right-tab-pagewidget' , 100 ) . click ( ) ;
} ) ;
it ( 'should show widgets in dropdown' , async ( ) = > {
await gu . toggleSidePanel ( 'right' , 'open' ) ;
await driver . find ( '.test-right-tab-pagewidget' ) . click ( ) ;
@ -360,6 +380,8 @@ describe('CustomWidgets', function () {
} ) ;
it ( 'should switch access level to none on new widget' , async ( ) = > {
widgets = [ widget1 , widget2 ] ;
await recreatePanel ( ) ;
await toggle ( ) ;
await select ( widget1 . name ) ;
assert . equal ( await access ( ) , AccessLevel . none ) ;
@ -533,6 +555,62 @@ describe('CustomWidgets', function () {
assert . equal ( await content ( ) , AccessLevel . none ) ;
} ) ;
it ( 'should offer only custom url when disabled' , async ( ) = > {
await toggle ( ) ;
await select ( CUSTOM_URL ) ;
await driver . executeScript ( 'window.gristConfig.enableWidgetRepository = false;' ) ;
await recreatePanel ( ) ;
assert . isTrue ( await driver . find ( '.test-config-widget-url' ) . isDisplayed ( ) ) ;
assert . isFalse ( await driver . find ( '.test-config-widget-select' ) . isPresent ( ) ) ;
} ) ;
} ) ;
describe ( 'gristApiSupport' , async ( ) = > {
beforeEach ( async function ( ) {
// Override gristConfig to enable widget list.
await driver . executeScript ( 'window.gristConfig.enableWidgetRepository = true;' ) ;
// We need to be sure that widget configuration panel is open all the time.
await gu . toggleSidePanel ( 'right' , 'open' ) ;
await recreatePanel ( ) ;
await driver . findWait ( '.test-right-tab-pagewidget' , 100 ) . click ( ) ;
} ) ;
it ( 'should set language in widget url' , async ( ) = > {
function languageMenu() {
return gu . currentDriver ( ) . find ( '.test-account-page-language .test-select-open' ) ;
}
async function language() {
return await gu . doInIframe ( await getCustomWidgetFrame ( ) , async ( ) = > {
const urlText = await driver . executeScript < string > ( 'return document.location.href' ) ;
const url = new URL ( urlText ) ;
return url . searchParams . get ( 'language' ) ;
} ) ;
}
async function switchLanguage ( lang : string ) {
await gu . openProfileSettingsPage ( ) ;
await gu . waitForServer ( ) ;
await languageMenu ( ) . click ( ) ;
await driver . findContentWait ( '.test-select-menu li' , lang , 100 ) . click ( ) ;
await gu . waitForServer ( ) ;
await driver . navigate ( ) . back ( ) ;
await gu . waitForServer ( ) ;
}
widgets = [ widget1 ] ;
await useManifest ( manifestEndpoint ) ;
await gu . openWidgetPanel ( ) ;
await toggle ( ) ;
await select ( widget1 . name ) ;
//Switch language to Polish
await switchLanguage ( 'Polski' ) ;
//Check if widgets have "pl" in url
assert . equal ( await language ( ) , 'pl' ) ;
//Switch back to English
await switchLanguage ( 'English' ) ;
//Check if widgets have "en" in url
assert . equal ( await language ( ) , 'en' ) ;
} ) ;
it ( "should support grist.selectedTable" , async ( ) = > {
// Open a custom widget with full access.
await gu . toggleSidePanel ( 'right' , 'open' ) ;
@ -633,26 +711,14 @@ describe('CustomWidgets', function () {
} ) ;
it ( "should support grist.getAccessTokens" , async ( ) = > {
const iframe = await driver . find ( 'iframe' ) ;
await driver . switchTo ( ) . frame ( iframe ) ;
try {
return await gu . doInIframe ( await getCustomWidgetFrame ( ) , async ( ) = > {
const tokenResult : AccessTokenResult = await driver . executeAsyncScript (
( done : any ) = > ( window as any ) . grist . getAccessToken ( ) . then ( done )
) ;
assert . sameMembers ( Object . keys ( tokenResult ) , [ 'ttlMsecs' , 'token' , 'baseUrl' ] ) ;
const result = await fetch ( tokenResult . baseUrl + ` /tables/Table1/records?auth= ${ tokenResult . token } ` ) ;
assert . sameMembers ( Object . keys ( await result . json ( ) ) , [ 'records' ] ) ;
} finally {
await driver . switchTo ( ) . defaultContent ( ) ;
}
} ) ;
it ( 'should offer only custom url when disabled' , async ( ) = > {
await toggle ( ) ;
await select ( CUSTOM_URL ) ;
await driver . executeScript ( 'window.gristConfig.enableWidgetRepository = false;' ) ;
await recreatePanel ( ) ;
assert . isTrue ( await driver . find ( '.test-config-widget-url' ) . isDisplayed ( ) ) ;
assert . isFalse ( await driver . find ( '.test-config-widget-select' ) . isPresent ( ) ) ;
} ) ;
} ) ;
} ) ;