var test = require('node:test'); var assert = require('node:assert/strict'); var fs = require('node:fs'); var path = require('node:path'); var playwright = require('playwright'); test('SMTP opens as a summary and preserves draft, secret and cancellation contracts', async function (t) { var browser = await playwright.chromium.launch(); t.after(function () { return browser.close(); }); var page = await browser.newPage(); await page.setContent('
'); await page.addScriptTag({ content: fs.readFileSync(path.join(__dirname, '../lib/public/modules/store.js'), 'utf8').replace(/export \{[^}]+\};?/g, '') }); await page.evaluate(function () { window.cfg = {host:'smtp.example.com',port:587,user:'user',pass:'••••••••',from:'mail@example.com'}; window.apiGet = async function () { return {smtp: window.cfg}; }; window.apiPost = async function (url, data) { window.saved = data; return window.fail ? {error:'Save failed'} : {ok:true}; }; window.escapeHtml = function (value) { var el = document.createElement('span'); el.textContent = value; return el.innerHTML; }; window.iconHtml = function () {return '';}; window.refreshIcons = window.showToast = function () {}; window.setSettingsDraft = function () {store.set({serverSettingsDrafts:{smtp:true}});}; window.clearSettingsDraft = function () {store.set({serverSettingsDrafts:{}});}; window.showConfirmDialog = function (message, title, callback) {window.confirmation = callback;}; }); await page.addScriptTag({content:fs.readFileSync(path.join(__dirname, '../lib/public/modules/admin-settings-email.js'), 'utf8').replace(/^import .*$/gm, '').replace(/export /g, '')}); await page.evaluate(function () {loadSmtpTab(document.querySelector('#body'));}); await page.locator('#smtp-edit').waitFor(); assert.equal(await page.locator('input').count(), 0); assert.match(await page.locator('#body').textContent(), /Configured · hidden/); await page.locator('#smtp-edit').click(); assert.equal(await page.evaluate(function () {return document.activeElement.id;}), 'smtp-host'); await page.locator('#smtp-host').fill('changed.example.com'); await page.locator('#smtp-cancel').click(); assert.equal(await page.locator('#smtp-host').inputValue(), 'changed.example.com'); await page.evaluate(function () {window.confirmation();}); assert.equal(await page.evaluate(function () {return document.activeElement.id;}), 'smtp-edit'); await page.locator('#smtp-edit').click(); assert.equal(await page.locator('#smtp-host').inputValue(), 'smtp.example.com'); await page.locator('#smtp-host').fill('saved.example.com'); await page.evaluate(function () {window.fail = true;}); await page.locator('#smtp-save').click(); await page.locator('#smtp-error').filter({hasText:'Save failed'}).waitFor(); assert.equal(await page.locator('#smtp-host').inputValue(), 'saved.example.com'); assert.equal(await page.evaluate(function () {return store.get('serverSettingsDrafts').smtp;}), true); await page.evaluate(function () {window.fail = false;}); await page.locator('#smtp-save').click(); await page.locator('#smtp-edit').waitFor(); assert.equal(await page.locator('input').count(), 0); assert.match(await page.locator('#body').textContent(), /saved.example.com/); await page.locator('#smtp-edit').click(); assert.equal(await page.locator('#smtp-pass').inputValue(), '••••••••'); await page.locator('#smtp-save').click(); await page.locator('#smtp-edit').waitFor(); assert.equal(await page.evaluate(function () {return window.saved.pass;}), '••••••••'); await page.locator('#smtp-edit').click(); await page.locator('#smtp-remove').click(); await page.evaluate(function () {window.confirmation();}); await page.locator('#smtp-edit').waitFor(); assert.match(await page.locator('#body').textContent(), /SMTP is not configured/); assert.equal(await page.locator('input').count(), 0); await page.locator('#smtp-edit').click(); assert.equal(await page.locator('#smtp-host').inputValue(), ''); await page.locator('#smtp-cancel').click(); assert.equal(await page.locator('input').count(), 0); });