2020-03-20 20:28:31 +00:00
import { expect } from 'chai' ;
2020-04-07 00:04:09 +00:00
import { dialog , BrowserWindow } from 'electron/main' ;
2023-01-25 21:01:25 +00:00
import { closeAllWindows } from './lib/window-helpers' ;
import { ifit , delay } from './lib/spec-helpers' ;
2016-12-01 22:15:05 +00:00
describe ( 'dialog module' , ( ) = > {
describe ( 'showOpenDialog' , ( ) = > {
2020-03-20 20:28:31 +00:00
afterEach ( closeAllWindows ) ;
2019-07-26 13:37:59 +00:00
ifit ( process . platform !== 'win32' ) ( 'should not throw for valid cases' , ( ) = > {
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { title : 'i am title' } ) ;
} ) . to . not . throw ( ) ;
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
const w = new BrowserWindow ( ) ;
dialog . showOpenDialog ( w , { title : 'i am title' } ) ;
} ) . to . not . throw ( ) ;
} ) ;
2019-05-21 14:08:22 +00:00
2016-12-01 22:15:05 +00:00
it ( 'throws errors when the options are invalid' , ( ) = > {
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { properties : false as any } ) ;
} ) . to . throw ( /Properties must be an array/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { title : 300 as any } ) ;
} ) . to . throw ( /Title must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { buttonLabel : [ ] as any } ) ;
} ) . to . throw ( /Button label must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { defaultPath : { } as any } ) ;
} ) . to . throw ( /Default path must be a string/ ) ;
2017-02-09 13:23:02 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showOpenDialog ( { message : { } as any } ) ;
} ) . to . throw ( /Message must be a string/ ) ;
} ) ;
} ) ;
2016-12-01 22:15:05 +00:00
describe ( 'showSaveDialog' , ( ) = > {
2020-03-20 20:28:31 +00:00
afterEach ( closeAllWindows ) ;
2019-07-26 13:37:59 +00:00
ifit ( process . platform !== 'win32' ) ( 'should not throw for valid cases' , ( ) = > {
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { title : 'i am title' } ) ;
} ) . to . not . throw ( ) ;
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
const w = new BrowserWindow ( ) ;
dialog . showSaveDialog ( w , { title : 'i am title' } ) ;
} ) . to . not . throw ( ) ;
} ) ;
2019-05-21 14:08:22 +00:00
2016-12-01 22:15:05 +00:00
it ( 'throws errors when the options are invalid' , ( ) = > {
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { title : 300 as any } ) ;
} ) . to . throw ( /Title must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { buttonLabel : [ ] as any } ) ;
} ) . to . throw ( /Button label must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { defaultPath : { } as any } ) ;
} ) . to . throw ( /Default path must be a string/ ) ;
2017-02-09 13:23:02 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { message : { } as any } ) ;
} ) . to . throw ( /Message must be a string/ ) ;
2017-02-09 13:23:02 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showSaveDialog ( { nameFieldLabel : { } as any } ) ;
} ) . to . throw ( /Name field label must be a string/ ) ;
} ) ;
} ) ;
2016-12-01 22:15:05 +00:00
describe ( 'showMessageBox' , ( ) = > {
2020-03-20 20:28:31 +00:00
afterEach ( closeAllWindows ) ;
2019-05-21 14:08:22 +00:00
2019-07-26 13:37:59 +00:00
// parentless message boxes are synchronous on macOS
// dangling message boxes on windows cause a DCHECK: https://cs.chromium.org/chromium/src/base/win/message_window.cc?l=68&rcl=7faa4bf236a866d007dc5672c9ce42660e67a6a6
ifit ( process . platform !== 'darwin' && process . platform !== 'win32' ) ( 'should not throw for a parentless message box' , ( ) = > {
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( { message : 'i am message' } ) ;
} ) . to . not . throw ( ) ;
} ) ;
2019-05-21 14:08:22 +00:00
2019-07-26 13:37:59 +00:00
ifit ( process . platform !== 'win32' ) ( 'should not throw for valid cases' , ( ) = > {
2019-05-21 14:08:22 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
const w = new BrowserWindow ( ) ;
dialog . showMessageBox ( w , { message : 'i am message' } ) ;
} ) . to . not . throw ( ) ;
} ) ;
2019-05-21 14:08:22 +00:00
2016-12-01 22:15:05 +00:00
it ( 'throws errors when the options are invalid' , ( ) = > {
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( undefined as any , { type : 'not-a-valid-type' , message : '' } ) ;
} ) . to . throw ( /Invalid message box type/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( null as any , { buttons : false as any , message : '' } ) ;
} ) . to . throw ( /Buttons must be an array/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( { title : 300 as any , message : '' } ) ;
} ) . to . throw ( /Title must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( { message : [ ] as any } ) ;
} ) . to . throw ( /Message must be a string/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( { detail : 3.14 as any , message : '' } ) ;
} ) . to . throw ( /Detail must be a string/ ) ;
2017-02-06 15:35:36 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showMessageBox ( { checkboxLabel : false as any , message : '' } ) ;
} ) . to . throw ( /checkboxLabel must be a string/ ) ;
} ) ;
} ) ;
2016-12-01 22:15:05 +00:00
2021-07-14 22:59:27 +00:00
describe ( 'showMessageBox with signal' , ( ) = > {
afterEach ( closeAllWindows ) ;
it ( 'closes message box immediately' , async ( ) = > {
const controller = new AbortController ( ) ;
const signal = controller . signal ;
const w = new BrowserWindow ( ) ;
const p = dialog . showMessageBox ( w , { signal , message : 'i am message' } ) ;
controller . abort ( ) ;
const result = await p ;
expect ( result . response ) . to . equal ( 0 ) ;
} ) ;
it ( 'closes message box after a while' , async ( ) = > {
const controller = new AbortController ( ) ;
const signal = controller . signal ;
const w = new BrowserWindow ( ) ;
const p = dialog . showMessageBox ( w , { signal , message : 'i am message' } ) ;
await delay ( 500 ) ;
controller . abort ( ) ;
const result = await p ;
expect ( result . response ) . to . equal ( 0 ) ;
} ) ;
it ( 'cancels message box' , async ( ) = > {
const controller = new AbortController ( ) ;
const signal = controller . signal ;
const w = new BrowserWindow ( ) ;
const p = dialog . showMessageBox ( w , {
signal ,
message : 'i am message' ,
buttons : [ 'OK' , 'Cancel' ] ,
cancelId : 1
} ) ;
controller . abort ( ) ;
const result = await p ;
expect ( result . response ) . to . equal ( 1 ) ;
} ) ;
it ( 'cancels message box after a while' , async ( ) = > {
const controller = new AbortController ( ) ;
const signal = controller . signal ;
const w = new BrowserWindow ( ) ;
const p = dialog . showMessageBox ( w , {
signal ,
message : 'i am message' ,
buttons : [ 'OK' , 'Cancel' ] ,
cancelId : 1
} ) ;
await delay ( 500 ) ;
controller . abort ( ) ;
const result = await p ;
expect ( result . response ) . to . equal ( 1 ) ;
} ) ;
} ) ;
2016-12-01 22:15:05 +00:00
describe ( 'showErrorBox' , ( ) = > {
it ( 'throws errors when the options are invalid' , ( ) = > {
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
( dialog . showErrorBox as any ) ( ) ;
} ) . to . throw ( /Insufficient number of arguments/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showErrorBox ( 3 as any , 'four' ) ;
} ) . to . throw ( /Error processing argument at index 0/ ) ;
2016-12-01 22:15:05 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showErrorBox ( 'three' , 4 as any ) ;
} ) . to . throw ( /Error processing argument at index 1/ ) ;
} ) ;
} ) ;
2017-04-04 17:49:21 +00:00
describe ( 'showCertificateTrustDialog' , ( ) = > {
it ( 'throws errors when the options are invalid' , ( ) = > {
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
( dialog . showCertificateTrustDialog as any ) ( ) ;
} ) . to . throw ( /options must be an object/ ) ;
2017-04-04 17:49:21 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showCertificateTrustDialog ( { } as any ) ;
} ) . to . throw ( /certificate must be an object/ ) ;
2017-04-04 17:49:21 +00:00
2018-06-18 14:56:03 +00:00
expect ( ( ) = > {
2020-03-20 20:28:31 +00:00
dialog . showCertificateTrustDialog ( { certificate : { } as any , message : false as any } ) ;
} ) . to . throw ( /message must be a string/ ) ;
} ) ;
} ) ;
} ) ;