1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

fix integration tests + global page-registry interfaces

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-11-12 15:46:01 +02:00
parent 356cbefddc
commit 78a4f73795
4 changed files with 22 additions and 9 deletions

View File

@ -13,6 +13,7 @@ const itif = (condition: boolean) => condition ? it : it.skip
jest.setTimeout(60000) jest.setTimeout(60000)
// FIXME (!): improve / simplify all css-selectors + use [data-test-id="some-id"] (already used in some tests below)
describe("Lens integration tests", () => { describe("Lens integration tests", () => {
const TEST_NAMESPACE = "integration-tests" const TEST_NAMESPACE = "integration-tests"
@ -394,7 +395,7 @@ describe("Lens integration tests", () => {
if (drawer !== "") { if (drawer !== "") {
it(`shows ${drawer} drawer`, async () => { it(`shows ${drawer} drawer`, async () => {
expect(clusterAdded).toBe(true) expect(clusterAdded).toBe(true)
await app.client.click(`.sidebar-nav #${drawerId} span.link-text`) await app.client.click(`.sidebar-nav [data-test-id="${drawerId}"] span.link-text`)
await app.client.waitUntilTextExists(`a[href^="/${pages[0].href}"]`, pages[0].name) await app.client.waitUntilTextExists(`a[href^="/${pages[0].href}"]`, pages[0].name)
}) })
} }
@ -409,7 +410,7 @@ describe("Lens integration tests", () => {
// hide the drawer // hide the drawer
it(`hides ${drawer} drawer`, async () => { it(`hides ${drawer} drawer`, async () => {
expect(clusterAdded).toBe(true) expect(clusterAdded).toBe(true)
await app.client.click(`.sidebar-nav #${drawerId} span.link-text`) await app.client.click(`.sidebar-nav [data-test-id="${drawerId}"] span.link-text`)
await expect(app.client.waitUntilTextExists(`a[href^="/${pages[0].href}"]`, pages[0].name, 100)).rejects.toThrow() await expect(app.client.waitUntilTextExists(`a[href^="/${pages[0].href}"]`, pages[0].name, 100)).rejects.toThrow()
}) })
} }
@ -428,7 +429,7 @@ describe("Lens integration tests", () => {
it(`shows a logs for a pod`, async () => { it(`shows a logs for a pod`, async () => {
expect(clusterAdded).toBe(true) expect(clusterAdded).toBe(true)
// Go to Pods page // Go to Pods page
await app.client.click(".sidebar-nav #workloads span.link-text") await app.client.click(".sidebar-nav [data-test-id='workloads'] span.link-text")
await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods") await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods")
await app.client.click('a[href^="/pods"]') await app.client.click('a[href^="/pods"]')
await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver") await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver")
@ -479,7 +480,7 @@ describe("Lens integration tests", () => {
it(`creates a pod in ${TEST_NAMESPACE} namespace`, async () => { it(`creates a pod in ${TEST_NAMESPACE} namespace`, async () => {
expect(clusterAdded).toBe(true) expect(clusterAdded).toBe(true)
await app.client.click(".sidebar-nav #workloads span.link-text") await app.client.click(".sidebar-nav [data-test-id='workloads'] span.link-text")
await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods") await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods")
await app.client.click('a[href^="/pods"]') await app.client.click('a[href^="/pods"]')
await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver") await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver")

View File

@ -30,5 +30,5 @@ export class PageMenuRegistry<T extends PageMenuRegistration> extends BaseRegist
} }
} }
export const globalPageMenuRegistry = new PageMenuRegistry(); export const globalPageMenuRegistry = new PageMenuRegistry<Omit<PageMenuRegistration, "subMenus">>();
export const clusterPageMenuRegistry = new PageMenuRegistry(); export const clusterPageMenuRegistry = new PageMenuRegistry();

View File

@ -20,7 +20,7 @@ export interface PageComponents {
Page: React.ComponentType<any>; Page: React.ComponentType<any>;
} }
export class PageRegistry extends BaseRegistry<PageRegistration> { export class PageRegistry<T extends PageRegistration> extends BaseRegistry<T> {
getItems() { getItems() {
return super.getItems().map(item => { return super.getItems().map(item => {
item.routePath = item.extension.getPageRoute(item.routePath) item.routePath = item.extension.getPageRoute(item.routePath)
@ -29,5 +29,5 @@ export class PageRegistry extends BaseRegistry<PageRegistration> {
} }
} }
export const globalPageRegistry = new PageRegistry(); export const globalPageRegistry = new PageRegistry<Omit<PageRegistration, "subPages">>();
export const clusterPageRegistry = new PageRegistry(); export const clusterPageRegistry = new PageRegistry();

View File

@ -97,6 +97,7 @@ export class Sidebar extends React.Component<Props> {
</div> </div>
<div className="sidebar-nav flex column box grow-fixed"> <div className="sidebar-nav flex column box grow-fixed">
<SidebarNavItem <SidebarNavItem
testId="cluster"
isActive={isActiveRoute(clusterRoute)} isActive={isActiveRoute(clusterRoute)}
isHidden={!isAllowedResource("nodes")} isHidden={!isAllowedResource("nodes")}
url={clusterURL()} url={clusterURL()}
@ -104,6 +105,7 @@ export class Sidebar extends React.Component<Props> {
icon={<Icon svg="kube"/>} icon={<Icon svg="kube"/>}
/> />
<SidebarNavItem <SidebarNavItem
testId="nodes"
isActive={isActiveRoute(nodesRoute)} isActive={isActiveRoute(nodesRoute)}
isHidden={!isAllowedResource("nodes")} isHidden={!isAllowedResource("nodes")}
url={nodesURL()} url={nodesURL()}
@ -111,6 +113,7 @@ export class Sidebar extends React.Component<Props> {
icon={<Icon svg="nodes"/>} icon={<Icon svg="nodes"/>}
/> />
<SidebarNavItem <SidebarNavItem
testId="workloads"
isActive={isActiveRoute(workloadsRoute)} isActive={isActiveRoute(workloadsRoute)}
isHidden={Workloads.tabRoutes.length == 0} isHidden={Workloads.tabRoutes.length == 0}
url={workloadsURL({ query })} url={workloadsURL({ query })}
@ -119,6 +122,7 @@ export class Sidebar extends React.Component<Props> {
icon={<Icon svg="workloads"/>} icon={<Icon svg="workloads"/>}
/> />
<SidebarNavItem <SidebarNavItem
testId="config"
isActive={isActiveRoute(configRoute)} isActive={isActiveRoute(configRoute)}
isHidden={Config.tabRoutes.length == 0} isHidden={Config.tabRoutes.length == 0}
url={configURL({ query })} url={configURL({ query })}
@ -127,6 +131,7 @@ export class Sidebar extends React.Component<Props> {
icon={<Icon material="list"/>} icon={<Icon material="list"/>}
/> />
<SidebarNavItem <SidebarNavItem
testId="networks"
isActive={isActiveRoute(networkRoute)} isActive={isActiveRoute(networkRoute)}
isHidden={Network.tabRoutes.length == 0} isHidden={Network.tabRoutes.length == 0}
url={networkURL({ query })} url={networkURL({ query })}
@ -135,6 +140,7 @@ export class Sidebar extends React.Component<Props> {
icon={<Icon material="device_hub"/>} icon={<Icon material="device_hub"/>}
/> />
<SidebarNavItem <SidebarNavItem
testId="storage"
isActive={isActiveRoute(storageRoute)} isActive={isActiveRoute(storageRoute)}
isHidden={Storage.tabRoutes.length == 0} isHidden={Storage.tabRoutes.length == 0}
url={storageURL({ query })} url={storageURL({ query })}
@ -143,6 +149,7 @@ export class Sidebar extends React.Component<Props> {
text={<Trans>Storage</Trans>} text={<Trans>Storage</Trans>}
/> />
<SidebarNavItem <SidebarNavItem
testId="namespaces"
isActive={isActiveRoute(namespacesRoute)} isActive={isActiveRoute(namespacesRoute)}
isHidden={!isAllowedResource("namespaces")} isHidden={!isAllowedResource("namespaces")}
url={namespacesURL()} url={namespacesURL()}
@ -150,6 +157,7 @@ export class Sidebar extends React.Component<Props> {
text={<Trans>Namespaces</Trans>} text={<Trans>Namespaces</Trans>}
/> />
<SidebarNavItem <SidebarNavItem
testId="events"
isActive={isActiveRoute(eventRoute)} isActive={isActiveRoute(eventRoute)}
isHidden={!isAllowedResource("events")} isHidden={!isAllowedResource("events")}
url={eventsURL({ query })} url={eventsURL({ query })}
@ -157,6 +165,7 @@ export class Sidebar extends React.Component<Props> {
text={<Trans>Events</Trans>} text={<Trans>Events</Trans>}
/> />
<SidebarNavItem <SidebarNavItem
testId="apps"
isActive={isActiveRoute(appsRoute)} isActive={isActiveRoute(appsRoute)}
url={appsURL({ query })} url={appsURL({ query })}
subMenus={Apps.tabRoutes} subMenus={Apps.tabRoutes}
@ -164,6 +173,7 @@ export class Sidebar extends React.Component<Props> {
text={<Trans>Apps</Trans>} text={<Trans>Apps</Trans>}
/> />
<SidebarNavItem <SidebarNavItem
testId="users"
isActive={isActiveRoute(usersManagementRoute)} isActive={isActiveRoute(usersManagementRoute)}
url={usersManagementURL({ query })} url={usersManagementURL({ query })}
subMenus={UserManagement.tabRoutes} subMenus={UserManagement.tabRoutes}
@ -171,6 +181,7 @@ export class Sidebar extends React.Component<Props> {
text={<Trans>Access Control</Trans>} text={<Trans>Access Control</Trans>}
/> />
<SidebarNavItem <SidebarNavItem
testId="custom-resources"
isActive={isActiveRoute(crdRoute)} isActive={isActiveRoute(crdRoute)}
isHidden={!isAllowedResource("customresourcedefinitions")} isHidden={!isAllowedResource("customresourcedefinitions")}
url={crdURL()} url={crdURL()}
@ -209,6 +220,7 @@ interface SidebarNavItemProps {
isHidden?: boolean; isHidden?: boolean;
isActive?: boolean; isActive?: boolean;
subMenus?: TabLayoutRoute[]; subMenus?: TabLayoutRoute[];
testId?: string; // data-test-id="" property for integration tests
} }
const navItemStorage = createStorage<[string, boolean][]>("sidebar_menu_item", []); const navItemStorage = createStorage<[string, boolean][]>("sidebar_menu_item", []);
@ -233,14 +245,14 @@ class SidebarNavItem extends React.Component<SidebarNavItemProps> {
}; };
render() { render() {
const { isHidden, isActive, subMenus = [], icon, text, url, children, className } = this.props; const { isHidden, isActive, subMenus = [], icon, text, url, children, className, testId } = this.props;
if (isHidden) { if (isHidden) {
return null; return null;
} }
const extendedView = (subMenus.length > 0 || children) && this.context.pinned; const extendedView = (subMenus.length > 0 || children) && this.context.pinned;
if (extendedView) { if (extendedView) {
return ( return (
<div className={cssNames("SidebarNavItem", className)}> <div className={cssNames("SidebarNavItem", className)} data-test-id={testId}>
<div className={cssNames("nav-item", { active: isActive })} onClick={this.toggleSubMenu}> <div className={cssNames("nav-item", { active: isActive })} onClick={this.toggleSubMenu}>
{icon} {icon}
<span className="link-text">{text}</span> <span className="link-text">{text}</span>