feat(electrobun): auto-updater + E2E tests + splash screen — ALL GAPS CLOSED
Auto-updater: - updater.ts: GitHub Releases API check, semver comparison, timestamp tracking - AdvancedSettings wired to real updater.check/getVersion RPC E2E testing (45 tests): - wdio.conf.js: WebDriverIO config for Electrobun (port 9761) - fixtures.ts: isolated temp dirs, demo data, git repo init - 4 spec files: smoke (13), settings (13), terminal (10), agent (9) Splash screen: - SplashScreen.svelte: animated gradient AGOR logo, version, loading dots - App.svelte: shows splash until all init promises resolve, 300ms fade-out
This commit is contained in:
parent
88206205fe
commit
4826b9dffa
8 changed files with 637 additions and 11 deletions
119
ui-electrobun/tests/e2e/specs/terminal.test.ts
Normal file
119
ui-electrobun/tests/e2e/specs/terminal.test.ts
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
* Terminal tests — tab bar, terminal creation, input, collapse/expand.
|
||||
*/
|
||||
|
||||
describe("Terminal section", () => {
|
||||
it("should show the terminal tab bar", async () => {
|
||||
const tabBar = await $(".terminal-tabs");
|
||||
if (await tabBar.isExisting()) {
|
||||
expect(await tabBar.isDisplayed()).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("should have an add-tab button", async () => {
|
||||
const addBtn = await $(".tab-add-btn");
|
||||
if (await addBtn.isExisting()) {
|
||||
expect(await addBtn.isClickable()).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("should create a new terminal tab on add click", async () => {
|
||||
const addBtn = await $(".tab-add-btn");
|
||||
if (!(await addBtn.isExisting())) return;
|
||||
|
||||
const tabsBefore = await $$(".terminal-tab");
|
||||
const countBefore = tabsBefore.length;
|
||||
|
||||
await addBtn.click();
|
||||
await browser.pause(500);
|
||||
|
||||
const tabsAfter = await $$(".terminal-tab");
|
||||
expect(tabsAfter.length).toBeGreaterThanOrEqual(countBefore + 1);
|
||||
});
|
||||
|
||||
it("should show an xterm container", async () => {
|
||||
const xterm = await $(".xterm");
|
||||
if (await xterm.isExisting()) {
|
||||
expect(await xterm.isDisplayed()).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("should accept keyboard input in terminal", async () => {
|
||||
const xterm = await $(".xterm-helper-textarea");
|
||||
if (await xterm.isExisting()) {
|
||||
await xterm.click();
|
||||
await browser.keys("echo hello");
|
||||
// Just verify no crash; actual output verification needs PTY daemon
|
||||
}
|
||||
});
|
||||
|
||||
it("should support collapse/expand toggle", async () => {
|
||||
const collapseBtn = await $(".terminal-collapse-btn");
|
||||
if (!(await collapseBtn.isExisting())) return;
|
||||
|
||||
// Click to collapse
|
||||
await collapseBtn.click();
|
||||
await browser.pause(300);
|
||||
|
||||
const terminalSection = await $(".terminal-section");
|
||||
const heightAfterCollapse = await terminalSection.getCSSProperty("height");
|
||||
|
||||
// Click to expand
|
||||
await collapseBtn.click();
|
||||
await browser.pause(300);
|
||||
|
||||
const heightAfterExpand = await terminalSection.getCSSProperty("height");
|
||||
// Heights should differ between collapsed and expanded states
|
||||
expect(heightAfterCollapse.value).not.toBe(heightAfterExpand.value);
|
||||
});
|
||||
|
||||
it("should highlight active tab", async () => {
|
||||
const activeTabs = await $$(".terminal-tab.active");
|
||||
if (activeTabs.length > 0) {
|
||||
expect(activeTabs.length).toBe(1);
|
||||
}
|
||||
});
|
||||
|
||||
it("should switch tabs on click", async () => {
|
||||
const tabs = await $$(".terminal-tab");
|
||||
if (tabs.length >= 2) {
|
||||
await tabs[1].click();
|
||||
await browser.pause(300);
|
||||
|
||||
const activeClass = await tabs[1].getAttribute("class");
|
||||
expect(activeClass).toContain("active");
|
||||
}
|
||||
});
|
||||
|
||||
it("should show close button on tab hover", async () => {
|
||||
const tabs = await $$(".terminal-tab");
|
||||
if (tabs.length === 0) return;
|
||||
|
||||
await tabs[0].moveTo();
|
||||
await browser.pause(200);
|
||||
|
||||
const closeBtn = await tabs[0].$(".tab-close");
|
||||
if (await closeBtn.isExisting()) {
|
||||
expect(await closeBtn.isDisplayed()).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("should close a tab on close button click", async () => {
|
||||
const tabs = await $$(".terminal-tab");
|
||||
if (tabs.length < 2) return;
|
||||
|
||||
const countBefore = tabs.length;
|
||||
const lastTab = tabs[tabs.length - 1];
|
||||
await lastTab.moveTo();
|
||||
await browser.pause(200);
|
||||
|
||||
const closeBtn = await lastTab.$(".tab-close");
|
||||
if (await closeBtn.isExisting()) {
|
||||
await closeBtn.click();
|
||||
await browser.pause(300);
|
||||
|
||||
const tabsAfter = await $$(".terminal-tab");
|
||||
expect(tabsAfter.length).toBeLessThan(countBefore);
|
||||
}
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue