diff --git a/app/apserver/business.go b/app/apserver/business.go deleted file mode 100644 index f546530ef..000000000 --- a/app/apserver/business.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build business - -package main - -import ( - _ "github.com/eolinker/apinto-business/business" -) diff --git a/frontend/.gitignore b/frontend/.gitignore index 3c1bf74ee..14d6126ec 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -55,3 +55,4 @@ yarn.lock /playwright-report/ /playwright/.cache/ /yarn.lock +/.angular/ diff --git a/frontend/projects/core/src/app/component/reset-psw/reset-psw.component.spec.ts b/frontend/projects/core/src/app/component/reset-psw/reset-psw.component.spec.ts deleted file mode 100644 index e7db3cbc7..000000000 --- a/frontend/projects/core/src/app/component/reset-psw/reset-psw.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' - -import { ResetPswComponent } from './reset-psw.component' - -describe('ResetPswComponent', () => { - let component: ResetPswComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ResetPswComponent] - }) - .compileComponents() - - fixture = TestBed.createComponent(ResetPswComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/component/transfer/transfer-search/transfer-search.component.spec.ts b/frontend/projects/core/src/app/component/transfer/transfer-search/transfer-search.component.spec.ts deleted file mode 100644 index c1d72e8de..000000000 --- a/frontend/projects/core/src/app/component/transfer/transfer-search/transfer-search.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' - -import { TransferSearchComponent } from './transfer-search.component' - -describe('TransferSearchComponent', () => { - let component: TransferSearchComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [TransferSearchComponent] - }) - .compileComponents() - - fixture = TestBed.createComponent(TransferSearchComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/component/user-avatar/user-avatar.component.spec.ts b/frontend/projects/core/src/app/component/user-avatar/user-avatar.component.spec.ts deleted file mode 100644 index f497c3121..000000000 --- a/frontend/projects/core/src/app/component/user-avatar/user-avatar.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' - -import { UserAvatarComponent } from './user-avatar.component' - -describe('UserAvatarComponent', () => { - let component: UserAvatarComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [UserAvatarComponent] - }) - .compileComponents() - - fixture = TestBed.createComponent(UserAvatarComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/component/user-profile/user-profile.component.spec.ts b/frontend/projects/core/src/app/component/user-profile/user-profile.component.spec.ts deleted file mode 100644 index 54c47c3d4..000000000 --- a/frontend/projects/core/src/app/component/user-profile/user-profile.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' - -import { UserProfileComponent } from './user-profile.component' - -describe('UserProfileComponent', () => { - let component: UserProfileComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [UserProfileComponent] - }) - .compileComponents() - - fixture = TestBed.createComponent(UserProfileComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/api/api-list/create/http-create/http-create.component.html b/frontend/projects/core/src/app/layout/api/api-list/create/http-create/http-create.component.html deleted file mode 100644 index a89f8b001..000000000 --- a/frontend/projects/core/src/app/layout/api/api-list/create/http-create/http-create.component.html +++ /dev/null @@ -1,336 +0,0 @@ -
- - -
-
-
-
-
-

基础信息:

- - 所属分组/API名称: -
- - - - - - - - -
-
- - - 描述: - - - - -
- -
-

拦截该接口的请求:

-

- 开启拦截后,网关会拦截所有该路径的请求,相当于防火墙禁用了特定路径的访问。 -

- - - - - - -
-
-

路由匹配规则:

- - 请求方式: -
- - -
-
-
-
- -
-
- - 请求路径: - - - - - - 请求路径不支持含有 ? 的字符串 - 必填项 - - - - - - 高级匹配: - - - - - - - - - 访问域名限制: - - - - -
-
-

转发规则:

- - 绑定上游服务: - - - - - - - 转发上游路径: - - - - - - - 请求超时时间: - - - - - - - 重试次数: - - - - - - - - 转发上游请求头: - - - -
- -
-
- - -
-
-
-
-
-

API 操作:

- - 绑定插件模板: - - - - -
-
- - - - 新增或修改 - 删除 - - -
-
diff --git a/frontend/projects/core/src/app/layout/api/api-list/import/import.component.spec.ts b/frontend/projects/core/src/app/layout/api/api-list/import/import.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/projects/core/src/app/layout/api/api-list/message/message.component.spec.ts b/frontend/projects/core/src/app/layout/api/api-list/message/message.component.spec.ts deleted file mode 100644 index 6b969ea3a..000000000 --- a/frontend/projects/core/src/app/layout/api/api-list/message/message.component.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { ApiCreateComponent } from '../create/create.component' -import { ApiManagementListComponent } from '../list/list.component' -import { ApiMessageComponent } from './message.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('ApiMessageComponent test', () => { - let component: ApiMessageComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ApiManagementListComponent - }, - { - path: 'message', - component: ApiMessageComponent - }, - { - path: 'create', - component: ApiCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ApiMessageComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/api/router/router.component.test.ts b/frontend/projects/core/src/app/layout/api/router/router.component.test.ts deleted file mode 100644 index abfd1242e..000000000 --- a/frontend/projects/core/src/app/layout/api/router/router.component.test.ts +++ /dev/null @@ -1,1008 +0,0 @@ -describe('API管理 e2e test', () => { - it('初始化页面,点击API管理菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.locator('eo-ng-menu-default').getByRole('link', { name: 'API管理' }).click() - }) - it('左侧目录组件与上方header间距6px, 一级menu196px*48px,字号14px, 与左侧距离24px;面包屑API管理,字号14,字体颜色为主题色,与左侧距离12px,垂直居中', async () => { - // 目录样式 左侧目录组件与上方header间距6px, 一级menu196px*48px,字号14px, 与左侧距离24px - const menuGroup = await page.locator('.ant-layout-sider-children') - const menuGroupMT = await menuGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(menuGroupMT).toStrictEqual('6px') - - const apiMenuItem = await page.locator('eo-ng-menu-default .ant-menu-item:has-text("API管理")') - const apiMenuItemH = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(apiMenuItemH).toStrictEqual('48px') - const apiMenuItemW = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(apiMenuItemW).toStrictEqual('195px') - const apiMenuItemPL = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - expect(apiMenuItemPL).toStrictEqual('24px') - const apiMenuItemSFS = await apiMenuItem.locator('span').evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(apiMenuItemSFS).toStrictEqual('20px') - const apiMenuItemAFS = await apiMenuItem.locator('a').evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(apiMenuItemAFS).toStrictEqual('14px') - const apiMenuItemBG = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(apiMenuItemBG).toStrictEqual('rgb(240, 247, 255)') - const apiMenuItemC = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(apiMenuItemC).toStrictEqual('rgb(34, 84, 157)') - - // 面包屑样式 面包屑API管理,字号14,字体颜色为主题色,与左侧距离12px,垂直居中 - const headerBlock = await page.locator('.block_rl') - const headerBlockAI = await headerBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('align-items')) - expect(headerBlockAI).toStrictEqual('center') - - const breadcrumbItem = await page.locator('nz-breadcrumb-item').getByRole('link', { name: 'API管理' }) - const breadcrumbItemFS = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(breadcrumbItemFS).toStrictEqual('14px') - const breadcrumbItemC = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(breadcrumbItemC).toStrictEqual('rgb(34, 84, 157)') - }) - it('分组组件宽234px,搜索主体上下margin12px,左右padding11px,高32px;搜索输入框高32px,边框圆角50px,与右侧按钮间距12px;按钮高32px,背景色与悬浮背景色不同', async () => { - // 分组组件宽234px - const groupBlock = await page.locator('.block-left') - const groupBlockW = await groupBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(groupBlockW).toStrictEqual('234px') - - // 搜索主体上下margin12px,左右padding11px,高32px - const searchBlock = await page.locator('.group-top') - const searchBlockM = await searchBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(searchBlockM).toStrictEqual('12px 0px') - const searchBlockP = await searchBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(searchBlockP).toStrictEqual('0px 11px') - const searchBlockH = await searchBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(searchBlockH).toStrictEqual('32px') - - // 搜索输入框高32px,边框圆角50px - const searchInput = await page.locator('eo-ng-input-group').first() - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(searchInputH).toStrictEqual('32px') - const searchInputR = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-radius')) - expect(searchInputR).toStrictEqual('50px') - - // 按钮高32px,与左侧输入框间距12px, 背景色与悬浮背景色不同 - const searchBtn = await page.locator('.ant-table-row-expand-icon') - const searchBtnH = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(searchBtnH).toStrictEqual('32px') - const searchBtnML = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(searchBtnML).toStrictEqual('12px') - const searchBtnBG = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(searchBtnBG).toStrictEqual('rgb(248, 248, 250)') - - // await page.hover('.ant-table-row-expand-icon') - // const searchBtnHBG = await page.locator('.ant-table-row-expand-icon').evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('background-color')) - // expect(searchBtnHBG).toStrictEqual('rgb(233, 238, 245)') - }) - it('分组标题-所有API,左侧间距16px,其他选项左侧间距8px;所有选项234px*30px,外侧无间距,背景色白色,鼠标悬浮与点击时,背景色变悬浮色', async () => { - // 分组标题-所有API,左侧间距16px,其他选项左侧间距12px - const groupTitle = await page.locator('div').filter({ hasText: '所有API' }).nth(4) - const groupTitlePL = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - expect(groupTitlePL).toStrictEqual('16px') - - const itemFTitle = await page.locator('eo-ng-tree-default-node').first() - const itemFTitlePL = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - expect(itemFTitlePL).toStrictEqual('8px') - - const itemLTitle = await page.locator('eo-ng-tree-default-node').last() - const itemLTitlePL = await itemLTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - expect(itemLTitlePL).toStrictEqual('8px') - - // 所有选项234px*30px,外侧无间距,背景色白色,鼠标悬浮与点击时,背景色变悬浮色 - const groupTitleH = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(groupTitleH).toContain('30') - const groupTitleW = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(groupTitleW).toContain('224') - const groupTitleM = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(groupTitleM).toStrictEqual('0px') - - await itemFTitle.click() - - const groupTitleBG = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(groupTitleBG).toStrictEqual('rgba(0, 0, 0, 0)') - await groupTitle.hover() - const groupTitleHBG = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(groupTitleHBG).toStrictEqual('rgb(240, 247, 255)') - await groupTitle.click() - const groupTitleCBG = await groupTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(groupTitleCBG).toStrictEqual('rgb(240, 247, 255)') - - const itemFTitleH = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(itemFTitleH).toContain('30px') - const itemFTitleW = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(itemFTitleW).toContain('224') - const itemFTitleM = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(itemFTitleM).toStrictEqual('3px 0px') - - const itemFTitleBG = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(itemFTitleBG).toStrictEqual('rgba(0, 0, 0, 0)') - await itemFTitle.hover() - const itemFTitleHBG = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(itemFTitleHBG).toStrictEqual('rgb(240, 247, 255)') - await itemFTitle.click() - const itemFTitleCBG = await itemFTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(itemFTitleCBG).toStrictEqual('rgb(240, 247, 255)') - }) - it('列表中按钮样式、表格、分页样式检查;不同协议/方法样式检查', async () => { - // 列表中按钮样式、表格、分页样式检查 - const createBtn = await page.getByRole('button', { name: '新建API' }) - - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(createBtnH).toStrictEqual('32px') - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(createBtnML).toStrictEqual('12px') - const createBtnP = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(createBtnP).toStrictEqual('0px 12px') - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - const createBtnBDC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - expect(createBtnBDC).toStrictEqual('rgb(34, 84, 157)') - - const importBtn = await page.getByRole('button', { name: '导入' }) - - const importBtnH = await importBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(importBtnH).toStrictEqual('32px') - const importBtnML = await importBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(importBtnML).toStrictEqual('12px') - const importBtnP = await importBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(importBtnP).toStrictEqual('0px 12px') - const importBtnBG = await importBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(importBtnBG).toStrictEqual('rgb(255, 255, 255)') - const importBtnBDC = await importBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - expect(importBtnBDC).toStrictEqual('rgb(217, 217, 217)') - - const onlineBtn = await page.getByRole('button', { name: '上线' }) - - const onlineBtnH = await onlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(onlineBtnH).toStrictEqual('32px') - const onlineBtnML = await onlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(onlineBtnML).toStrictEqual('12px') - const onlineBtnP = await onlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(onlineBtnP).toStrictEqual('0px 12px') - const onlineBtnBG = await onlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(onlineBtnBG).toStrictEqual('rgb(245, 245, 245)') - const onlineBtnBDC = await onlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - expect(onlineBtnBDC).toStrictEqual('rgb(217, 217, 217)') - - const offlineBtn = await page.getByRole('button', { name: '下线' }) - - const offlineBtnH = await offlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(offlineBtnH).toStrictEqual('32px') - const offlineBtnML = await offlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(offlineBtnML).toStrictEqual('12px') - const offlineBtnP = await offlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(offlineBtnP).toStrictEqual('0px 12px') - const offlineBtnBG = await offlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(offlineBtnBG).toStrictEqual('rgb(245, 245, 245)') - const offlineBtnBDC = await offlineBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - expect(offlineBtnBDC).toStrictEqual('rgb(217, 217, 217)') - - const searchInputGroup = await page.locator('eo-ng-api-management-list .group-search-large.mg-top-right') - const searchInputGroupMR = await searchInputGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - expect(searchInputGroupMR).toStrictEqual('24px') - - const searchInput = await page.locator('eo-ng-api-management-list eo-ng-input-group') - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(searchInputH).toStrictEqual('32px') - const searchInputW = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(searchInputW).toStrictEqual('254px') - const searchInputML = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(searchInputML).toStrictEqual('12px') - - const listHeader = await page.locator('.list-header') - const listHeaerPT = await listHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(listHeaerPT).toStrictEqual('12px') - - const listContent = await page.locator('.list-content') - const listContentPT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(listContentPT).toStrictEqual('0px') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(listContentMT).toStrictEqual('12px') - const listContentPB = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - expect(listContentPB).toStrictEqual('20px') - - const pagination = await page.locator('.mg_pagination_t') - const paginationH = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(paginationH).toStrictEqual('32px') - const paginationPT = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(paginationPT).toStrictEqual('0px') - const paginationMT = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(paginationMT).toStrictEqual('16px') - - // 表头宽度、字体左右间距,表头字体颜色 - const selectTh = await page.locator('.ant-table-selection-column').first() - const selectThW = await selectTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(selectThW).toStrictEqual('40px') - - const methodTh = await page.getByRole('columnheader', { name: '协议/方法' }) - const methodThW = await methodTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(methodThW).toStrictEqual('140px') - const methodThP = await methodTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(methodThP).toStrictEqual('0px 12px') - const methodThFS = await methodTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(methodThFS).toStrictEqual('14px') - const methodThFW = await methodTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(methodThFW).toStrictEqual('400') - const methodThC = await methodTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(methodThC).toStrictEqual('rgb(102, 102, 102)') - - const operationTh = await page.getByRole('columnheader', { name: '操作' }) - const operationThW = await operationTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(operationThW).toStrictEqual('130px') - - // 不同协议/方法样式检查 - const deleteTag = await page.locator('span.method:has-text("DELETE")').first() - if (deleteTag && await deleteTag.isVisible()) { - const deleteTagH = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(deleteTagH).toStrictEqual('20px') - const deleteTagLH = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(deleteTagLH).toStrictEqual('12px') - const deleteTagP = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(deleteTagP).toStrictEqual('4px 6px') - const deleteTagBG = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(deleteTagBG).toStrictEqual('rgba(194, 22, 27, 0.15)') - const deleteTagC = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(deleteTagC).toStrictEqual('rgb(194, 22, 27)') - const deleteTagFS = await deleteTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(deleteTagFS).toStrictEqual('12px') - } - - const getTag = await page.locator('span.method:has-text("GET")').first() - if (getTag && await getTag.isVisible()) { - const getTagH = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(getTagH).toStrictEqual('20px') - const getTagLH = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(getTagLH).toStrictEqual('12px') - const getTagP = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(getTagP).toStrictEqual('4px 6px') - const getTagBG = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(getTagBG).toStrictEqual('rgba(6, 125, 219, 0.15)') - const getTagC = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(getTagC).toStrictEqual('rgb(6, 125, 219)') - const getTagFS = await getTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(getTagFS).toStrictEqual('12px') - } - - const postTag = await page.locator('span.method:has-text("POST")').first() - if (postTag && await postTag.isVisible()) { - const postTagH = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(postTagH).toStrictEqual('20px') - const postTagLH = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(postTagLH).toStrictEqual('12px') - const postTagP = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(postTagP).toStrictEqual('4px 6px') - const postTagBG = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(postTagBG).toStrictEqual('rgba(16, 165, 75, 0.15)') - const postTagC = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(postTagC).toStrictEqual('rgb(16, 165, 75)') - const postTagFS = await postTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(postTagFS).toStrictEqual('12px') - } - - const putTag = await page.locator('span.method:has-text("PUT")').first() - if (putTag && await putTag.isVisible()) { - const putTagH = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(putTagH).toStrictEqual('20px') - const putTagLH = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(putTagLH).toStrictEqual('12px') - const putTagP = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(putTagP).toStrictEqual('4px 6px') - const putTagBG = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(putTagBG).toStrictEqual('rgba(216, 131, 12, 0.15)') - const putTagC = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(putTagC).toStrictEqual('rgb(216, 131, 12)') - const putTagFS = await putTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(putTagFS).toStrictEqual('12px') - } - - const allTag = await page.locator('span.method:has-text("ALL")').first() - if (allTag && await allTag.isVisible()) { - const allTagH = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(allTagH).toStrictEqual('20px') - const allTagLH = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(allTagLH).toStrictEqual('12px') - const allTagP = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(allTagP).toStrictEqual('4px 6px') - const allTagBG = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(allTagBG).toStrictEqual('rgba(119, 40, 245, 0.15)') - const allTagC = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(allTagC).toStrictEqual('rgb(119, 40, 245)') - const allTagFS = await allTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(allTagFS).toStrictEqual('12px') - } - - const patchTag = await page.locator('span.method:has-text("PATCH")').first() - if (patchTag && await patchTag.isVisible()) { - const patchTagH = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(patchTagH).toStrictEqual('20px') - const patchTagLH = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(patchTagLH).toStrictEqual('12px') - const patchTagP = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(patchTagP).toStrictEqual('4px 6px') - const patchTagBG = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(patchTagBG).toStrictEqual('rgba(237, 134, 58, 0.15)') - const patchTagC = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(patchTagC).toStrictEqual('rgb(237, 134, 58)') - const patchTagFS = await patchTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(patchTagFS).toStrictEqual('12px') - } - - const headTag = await page.locator('span.method:has-text("HEAD")').first() - if (headTag && await headTag.isVisible()) { - const headTagH = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(headTagH).toStrictEqual('20px') - const headTagLH = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - expect(headTagLH).toStrictEqual('12px') - const headTagP = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(headTagP).toStrictEqual('4px 6px') - const headTagBG = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(headTagBG).toStrictEqual('rgba(238, 196, 12, 0.15)') - const headTagC = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(headTagC).toStrictEqual('rgb(238, 196, 12)') - const headTagFS = await headTag.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(headTagFS).toStrictEqual('12px') - } - }) - it('点击分组,menu中API管理始终被选中,鼠标悬浮在分组中,测试更多操作,直至点击添加api,将跳转至新建api页面', async () => { - await page.locator('.custom-node >> nth = 0').click() - - const apiMenuItem = await page.locator('eo-ng-menu-default .ant-menu-item:has-text("API管理")') - const apiMenuItemBG = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(apiMenuItemBG).toStrictEqual('rgb(240, 247, 255)') - const apiMenuItemC = await apiMenuItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(apiMenuItemC).toStrictEqual('rgb(34, 84, 157)') - - await page.hover('.custom-node >> nth = 0') - const dropdownBtn = await page.locator('.custom-node >> nth = 0 >> button') - await dropdownBtn.click() - await page.getByText('添加子分组').click() - await page.getByPlaceholder('分组名称').fill('test') - await page.getByRole('button', { name: '确定' }).click() - - await page.locator('.ant-table-row-expand-icon').click() - await page.getByPlaceholder('分组名称').fill('test2') - await page.getByRole('button', { name: '确定' }).click() - await page.getByText('test2').last().click() - - await page.locator('.custom-node').last().hover() - await page.locator('.custom-node').last().locator('button').isVisible() - await page.locator('.custom-node').last().locator('button').click() - await page.getByText('编辑').click() - await page.getByPlaceholder('分组名称').fill('testE2E') - await page.getByRole('button', { name: '确定' }).click() - await page.locator('.custom-node').last().getByRole('button', { name: '' }).click() - await page.getByText('删除').first().click() - await page.getByRole('button', { name: '取消' }).click() - await page.locator('.custom-node').last().getByRole('button', { name: '' }).click() - await page.getByText('删除').first().click() - await page.getByRole('button', { name: '确定' }).click() - await page.waitForTimeout(1000) - await page.locator('.custom-node').last().hover() - await page.locator('.custom-node').last().locator('button').isVisible() - await page.locator('.custom-node').last().locator('button').click() - await page.waitForTimeout(1000) - await page.getByText('添加子分组').click() - await page.getByPlaceholder('分组名称').fill('test-1') - await page.getByRole('button', { name: '确定' }).click() - await page.waitForTimeout(1000) - await page.locator('nz-tree-node-title').filter({ hasText: 'test-1' }).last().hover() - await page.locator('nz-tree-node-title').filter({ hasText: 'test-1' }).last().locator('button').isVisible() - await page.locator('nz-tree-node-title').filter({ hasText: 'test-1' }).last().locator('button').click() - await page.getByText('添加 API').click() - }) - it('从分组内部的添加api进入新建api页面,其中分组栏不为空,检查表单页所有输入框样式,点击取消,返回列表页', async () => { - // 所属分组值不为空,样式 - const groupInput = await page.locator('eo-ng-tree-select div') - expect(await groupInput.inputValue).not.toStrictEqual('') - const groupInputW = await groupInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const groupInputH = await groupInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(groupInputW).toStrictEqual('202px') - await expect(groupInputH).toStrictEqual('32px') - - // API名称 - const nameInput = await page.getByPlaceholder('请输入API名称') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('306px') - await expect(nameInputH).toStrictEqual('32px') - - // 所属分组group - const inputGroup = await page.locator('eo-ng-input-group') - const inputGroupW = await inputGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const inputGroupH = await inputGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(inputGroupW).toStrictEqual('508px') - await expect(inputGroupH).toStrictEqual('32px') - - // 描述样式 - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('508px') - await expect(descInputH).toStrictEqual('68px') - - // 请求路径 - const requestPathInput = await page.locator('#requestPath') - const requestPathInputW = await requestPathInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const requestPathInputH = await requestPathInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(requestPathInputW).toStrictEqual('508px') - await expect(requestPathInputH).toStrictEqual('32px') - - // 绑定上游服务 - const upstreamInput = await page.locator('eo-ng-select-top-control') - const upstreamInputW = await upstreamInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const upstreamInputH = await upstreamInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(upstreamInputW).toStrictEqual('508px') - await expect(upstreamInputH).toStrictEqual('32px') - - // 请求方式 - const checkboxGroup = await page.getByText('All GETPOSTPUTDELETEPATCHHEAD') - const checkboxGroupH = await checkboxGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(checkboxGroupH).toStrictEqual('32px') - - // 转发上游路径 - const upstreamPathInput = await page.locator('#proxyPath') - const upstreamPathInputW = await upstreamPathInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const upstreamPathInputH = await upstreamPathInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(upstreamPathInputW).toStrictEqual('508px') - await expect(upstreamPathInputH).toStrictEqual('32px') - - // 请求超时时间 - const timeOutInput = await page.locator('#timeout') - const timeOutInputW = await timeOutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const timeOutInputH = await timeOutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(timeOutInputW).toStrictEqual('508px') - await expect(timeOutInputH).toStrictEqual('32px') - - // 重试次数 - const retryInput = await page.locator('#retry') - const retryInputW = await retryInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const retryInputH = await retryInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(retryInputW).toStrictEqual('508px') - await expect(retryInputH).toStrictEqual('32px') - - // 高级匹配 - const filterBtn1 = await page.locator('eo-ng-match-table').getByRole('button', { name: '添加配置' }).first() - const filterBtn1W = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn1H = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn1BGC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const filterBtn1BC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const filterBtn1C = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn1W).toStrictEqual('82px') - await expect(filterBtn1H).toStrictEqual('32px') - await expect(filterBtn1BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn1BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn1C).toStrictEqual('rgba(0, 0, 0, 0.85)') - // filterBtn1.hover() - // filterBtn1BC = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(filterBtn1BC).toStrictEqual('rgb(34, 84, 157)') - // filterBtn1C = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(filterBtn1C).toStrictEqual('rgb(34, 84, 157)') - - // 转发上游请求头 - const filterBtn2 = await page.locator('nz-form-item').filter({ hasText: '转发上游请求头 添加配置' }).getByRole('button', { name: '添加配置' }) - const filterBtn2W = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn2H = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn2BGC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const filterBtn2BC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const filterBtn2C = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn2W).toStrictEqual('82px') - await expect(filterBtn2H).toStrictEqual('32px') - await expect(filterBtn2BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn2BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn2C).toStrictEqual('rgba(0, 0, 0, 0.85)') - // filterBtn2.hover() - // filterBtn2BC = await filterBtn2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(filterBtn2BC).toStrictEqual('rgb(34, 84, 157)') - // filterBtn2C = await filterBtn2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(filterBtn2C).toStrictEqual('rgb(34, 84, 157)') - - await page.getByRole('button', { name: '取消' }).click() - }) - it('在搜索框输入文字,被搜中的关键字为主题色,清空搜索,无主题色字体', async () => { - await page.getByPlaceholder('搜索').first().click() - await page.getByPlaceholder('搜索').first().fill('test') - await page.locator('.highlight').first().click() - - const highlightText = await page.locator('.highlight').first() - const highlightTextC = await highlightText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - await expect(highlightTextC).toStrictEqual('rgb(34, 84, 157)') - - await page.locator('.anticon > svg').first().click() - expect(await page.locator('.highlight').first().isVisible()).toStrictEqual(false) - }) - it('点击新建API,清空必输项,表单无法保存;逐个填写必填项,直至表单可以提交,将返回列表页', async () => { - await page.getByRole('button', { name: '新建API' }).click() - await page.getByRole('button', { name: '保存' }).click() - - await page.locator('eo-ng-input-group nz-form-control').filter({ hasText: '请选择 必填项' }).getByRole('alert').click() - await page.locator('eo-ng-input-group').getByText('必填项').nth(1).click() - await page.locator('nz-form-item').filter({ hasText: '请求路径必填项' }).getByRole('alert').click() - await page.locator('nz-form-item').filter({ hasText: '绑定上游服务 请选择 必填项' }).getByRole('alert').click() - await page.locator('.ant-form-item-with-help > .ant-form-item-explain > .ant-form-item-explain-error').click() - await page.locator('nz-form-item').filter({ hasText: '转发上游路径必填项' }).getByRole('alert').click() - await page.getByText('请求超时时间').click() - await page.locator('#timeout').fill('1000') - await page.locator('#timeout').click() - await page.locator('#timeout').fill('') - await page.locator('nz-form-item').filter({ hasText: '保存 取消' }).click() - await page.locator('nz-form-item').filter({ hasText: '保存 取消' }).click() - await page.locator('#retry').click() - await page.locator('#retry').fill('') - await page.locator('nz-form-control').filter({ hasText: '必填项单位:ms,最小值:1' }).getByRole('alert').click() - await page.getByText('单位:ms,最小值:1').click() - await page.locator('nz-form-item').filter({ hasText: '重试次数必填项' }).getByRole('alert').click() - await page.locator('eo-ng-tree-select div').click() - await page.locator('eo-ng-tree-default-node').filter({ hasText: '应用管理' }).locator('svg').click() - await page.getByText('测试').click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('请输入API名称').click() - await page.getByPlaceholder('请输入API名称').fill('testForE2e') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#requestPath').click() - await page.locator('#requestPath').fill('test') - await page.getByText('请输入以/开头,/-_与花括号、大小写字母、数字的组合').click() - await page.locator('nz-form-item').filter({ hasText: '转发上游路径请输入以/开头,/-_与花括号、大小写字母、数字的组合' }).getByRole('alert').click() - await page.getByText('请求路径').click() - await page.locator('#requestPath').click() - await page.locator('#requestPath').fill('/test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-select-top-control').click() - await page.getByText('test').nth(1).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#proxyPath').click() - await page.locator('#proxyPath').click() - await page.locator('#proxyPath').fill('/test') - await page.locator('#timeout').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#timeout').click() - await page.locator('#timeout').fill('-1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#timeout').click() - await page.locator('#retry').click() - await page.locator('#retry').fill('2') - await page.getByRole('button', { name: '保存' }).click() - await page.getByLabel('All').check() - await page.getByRole('button', { name: '保存' }).click() - }) - - it('点击导入,出现抽屉弹窗,检查样式', async () => { - await page.locator('div').filter({ hasText: '所有API' }).nth(4).click() - await page.getByRole('button', { name: '导入' }).click() - - // 上传文件 - const uploadBtn = await page.getByRole('button', { name: '选择文件 支持swagger3.0的json、yaml格式' }).getByRole('button', { name: '选择文件' }) - const uploadBtnW = await uploadBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const uploadBtnH = await uploadBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const uploadBtnBGC = await uploadBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const uploadBtnBC = await uploadBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const uploadBtnC = await uploadBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(uploadBtnW).toStrictEqual('82px') - await expect(uploadBtnH).toStrictEqual('32px') - await expect(uploadBtnBGC).toStrictEqual('rgb(255, 255, 255)') - await expect(uploadBtnBC).toStrictEqual('rgb(217, 217, 217)') - await expect(uploadBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - // uploadBtn.hover() - // uploadBtnBC = await uploadBtn.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(uploadBtnBC).toStrictEqual('rgb(34, 84, 157)') - // uploadBtnC = await uploadBtn.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(uploadBtnC).toStrictEqual('rgb(34, 84, 157)') - - // API分组 - const timeOutInput = await page.locator('eo-ng-tree-select div') - const timeOutInputW = await timeOutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const timeOutInputH = await timeOutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(timeOutInputW).toStrictEqual('346px') - await expect(timeOutInputH).toStrictEqual('32px') - - // 绑定上游服务 - const upstreamInput = await page.locator('#upstream eo-ng-select-top-control') - const upstreamInputW = await upstreamInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const upstreamInputH = await upstreamInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(upstreamInputW).toStrictEqual('346px') - await expect(upstreamInputH).toStrictEqual('32px') - - // 请求前缀 - const prefixInput = await page.getByPlaceholder('请输入') - const prefixInputW = await prefixInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const prefixInputH = await prefixInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(prefixInputW).toStrictEqual('346px') - await expect(prefixInputH).toStrictEqual('32px') - - // 查重 - const checkBtn = await page.getByRole('button', { name: '查重' }) - const checkBtnW = await checkBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const checkBtnH = await checkBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const checkBtnBGC = await checkBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const checkBtnBC = await checkBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const checkBtnC = await checkBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(checkBtnW).toStrictEqual('54px') - await expect(checkBtnH).toStrictEqual('32px') - await expect(checkBtnBGC).toStrictEqual('rgb(34, 84, 157)') - await expect(checkBtnBC).toStrictEqual('rgb(34, 84, 157)') - await expect(checkBtnC).toStrictEqual('rgb(255, 255, 255)') - - // 取消 - const cancleBtn = await page.getByRole('button', { name: '取消' }) - const cancleBtnW = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const cancleBtnH = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const cancleBtnBGC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const cancleBtnML = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(cancleBtnW).toStrictEqual('54px') - await expect(cancleBtnH).toStrictEqual('32px') - await expect(cancleBtnBGC).toStrictEqual('rgb(255, 255, 255)') - await expect(cancleBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - await expect(cancleBtnML).toStrictEqual('12px') - - await page.setInputFiles('.ant-upload input', './test/swagger.yml') - - await page.locator('.ant-drawer-body').click() - await page.getByRole('button', { name: '查重' }).click() - await page.locator('eo-ng-tree-select div').click() - await page.locator('eo-ng-tree-default-node.ant-select-tree-treenode').first().locator('nz-tree-node-switcher').click() - await page.locator('eo-ng-tree-default-node.ant-select-tree-treenode').filter({ hasText: 'test' }).first().click() - await page.getByRole('button', { name: '查重' }).click() - await page.locator('#upstream eo-ng-select-top-control').click() - await page.getByText('twqwt').click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('/testForE2e') - await page.getByRole('button', { name: '查重' }).click() - - // 表格 - const table = await page.locator('.ant-drawer-body eo-ng-apinto-table') - const tableM = await table.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(tableM).toStrictEqual('0px auto') - - // 提交 - const submitBtn = await page.getByRole('button', { name: '提交' }) - const submitBtnW = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const submitBtnH = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const submitBtnBGC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const submitBtnBC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const submitBtnC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(submitBtnW).toStrictEqual('54px') - await expect(submitBtnH).toStrictEqual('32px') - await expect(submitBtnBGC).toStrictEqual('rgb(34, 84, 157)') - await expect(submitBtnBC).toStrictEqual('rgb(34, 84, 157)') - await expect(submitBtnC).toStrictEqual('rgb(255, 255, 255)') - - // 取消 - const cancle2Btn = await page.getByRole('button', { name: '返回上级' }) - const cancle2BtnW = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const cancle2BtnH = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const cancle2BtnBGC = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancle2BtnBC = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancle2BtnC = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const cancle2BtnML = await cancle2Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(cancle2BtnW).toStrictEqual('82px') - await expect(cancle2BtnH).toStrictEqual('32px') - await expect(cancle2BtnBGC).toStrictEqual('rgb(255, 255, 255)') - await expect(cancle2BtnBC).toStrictEqual('rgb(217, 217, 217)') - await expect(cancle2BtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - await expect(cancle2BtnML).toStrictEqual('12px') - - // 提交 - - await page.getByRole('row', { name: '序号 API名称 协议/方法 请求路径 描述 状态' }).getByLabel('').uncheck() - await page.locator('.ant-drawer-body label >> nth = 2').check() - await page.getByRole('button', { name: '提交' }).click() - }) - it('在左侧列表选中api,可操作批量上下线,并检查样式', async () => { - await page.locator('.ant-table-selection-column').first().click() - await page.locator('.ant-table-selection-column').first().click() - - await page.locator('label.ant-checkbox-wrapper >> nth = 2').check() - await page.locator('label.ant-checkbox-wrapper >> nth = 3').check() - - await page.getByRole('button', { name: '上线' }).click() - await page.getByText('批量上线').click() - await page.getByText('*选择网关集群').click() - await page.locator('.ant-row input').first().click() - await page.getByRole('button', { name: '下一步' }).last().click() - await page.getByRole('button', { name: '上一步' }).last().click() - await page.getByRole('button', { name: '下一步' }).last().click() - await page.locator('.ant-drawer-title').getByText('检测结果').last().click() - await page.getByRole('button', { name: '重新检测' }).last().click() - await page.locator('.ant-drawer-title').getByText('检测结果').last().click() - await page.getByRole('button', { name: '批量上线' }).last().click() - await page.locator('.ant-drawer-title').getByText('批量上线结果').click() - await page.getByRole('button', { name: '返回' }).last().click() - - await page.waitForTimeout(700) - await page.locator('label.ant-checkbox-wrapper >> nth = 2').check() - await page.locator('label.ant-checkbox-wrapper >> nth = 3').check() - await page.getByRole('button', { name: '下线' }).last().click() - await page.getByText('*选择网关集群').last().click() - await page.locator('.ant-row input').first().click() - await page.locator('.ant-drawer-title').getByText('批量下线').last().click() - await page.getByRole('button', { name: '取消' }).last().click() - await page.getByRole('button', { name: '下线' }).last().click() - await page.locator('.ant-row input').first().click() - await page.getByRole('button', { name: '提交' }).last().click() - await page.locator('.ant-drawer-title').getByText('批量下线结果').last().click() - await page.getByRole('button', { name: '返回' }).last().click() - }) - it('在列表中选择来源,输入搜索内容', async () => { - ; - await page.getByRole('columnheader', { name: '来源' }).locator('svg').click() - await page.getByRole('listitem').filter({ hasText: '自建' }).locator('label').click() - await page.getByRole('button', { name: '确定' }).click() - await page.locator('nz-filter-trigger span').click() - await page.getByRole('listitem').filter({ hasText: '导入' }).locator('label').click() - await page.getByRole('button', { name: '确定' }).click() - await page.getByRole('columnheader', { name: '来源' }).locator('svg').click() - await page.getByRole('button', { name: '重置' }).click() - - await page.getByPlaceholder('搜索API名称').click() - await page.getByPlaceholder('搜索API名称').fill('test') - await page.getByPlaceholder('搜索API名称').press('Enter') - - await page.getByPlaceholder('搜索API名称').fill('') - await page.getByPlaceholder('搜索API名称').press('Enter') - }) - it('点击单个api,进入信息页,修改输入并提交,返回列表页', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').click() - await page.getByText('请求超时时间').click() - await page.locator('#timeout').click() - await page.locator('#timeout').fill('') - await page.getByRole('button', { name: '提交' }).click() - await page.locator('#timeout').click() - await page.locator('#timeout').fill('200') - await page.getByRole('button', { name: '提交' }).click() - }) - it('点击单个api,点击上线管理tab,进入上线管理页,检查样式', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').click() - - await page.getByRole('link', { name: '上线管理' }).click() - await page.getByRole('columnheader', { name: '集群名称' }).click() - - const table = await page.locator('eo-ng-apinto-table') - const tableM = await table.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const tableP = await table.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - await expect(tableM).toStrictEqual('0px') - await expect(tableP).toStrictEqual('0px') - - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - const listContentPB = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - - await expect(listContentMT).toStrictEqual('12px') - await expect(listContentPB).toStrictEqual('20px') - }) - it('点击API信息tab,点击取消返回上线管理页,点击面包屑返回api列表页,再次进入api信息页,点击面包屑返回', async () => { - await page.getByRole('link', { name: 'API信息' }).click() - await page.getByRole('button', { name: '取消' }).click() - - await page.locator('nz-breadcrumb').getByRole('link', { name: 'API管理' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').click() - - await page.locator('nz-breadcrumb').getByRole('link', { name: 'API管理' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').click() - - await page.getByText('API管理 / API信息 /').click() - await page.locator('nz-breadcrumb').getByText('API信息').click() - await page.getByRole('link', { name: '上线管理' }).click() - await page.locator('nz-breadcrumb').getByRole('link', { name: 'API管理' }).click() - }) - it('API列表的分页测试', async () => { - await page.getByRole('listitem', { name: '2' }).getByText('2').click() - await page.getByRole('listitem', { name: '3' }).getByText('3').click() - await page.getByText('20 条/页').click() - await page.getByText('50 条/页').click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/application/application.component.test.ts b/frontend/projects/core/src/app/layout/application/application.component.test.ts deleted file mode 100644 index f2c1e7ec4..000000000 --- a/frontend/projects/core/src/app/layout/application/application.component.test.ts +++ /dev/null @@ -1,975 +0,0 @@ - -describe('应用管理 e2e test', () => { - it('初始化页面,点击应用管理菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByRole('link', { name: '应用管理' }).click() - }) - it('按钮大小、背景色、字体颜色,输入框大小,右侧间距为24px,table字体左右间距12px,上方间距12p, 最后一列的图标间距为12、16、24px,分页组件的样式', async () => { - // 新建应用的按钮样式 - const createBtn = await page.getByRole('button', { name: '新建应用' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 搜索框的样式 - const searchInput = await page.locator('eo-ng-input-group') - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInputW = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInputBC = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchInputML = await (await page.locator('.mg-top-right >> nth = 1')).evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - - expect(searchInputH).toStrictEqual('32px') - expect(searchInputW).toStrictEqual('254px') - expect(searchInputBC).toStrictEqual('rgb(217, 217, 217)') - expect(searchInputML).toStrictEqual('24px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - - // 分页样式 - const paginationM = await page.locator('.mg_pagination_t') - const paginationMT = await paginationM.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const paginationMH = await paginationM.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(paginationMT).toStrictEqual('16px') - expect(paginationMH).toStrictEqual('32px') - - const pagination = await page.locator('eo-ng-pagination') - const paginationMR = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - const paginationH = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(paginationMR).toStrictEqual('24px') - expect(paginationH).toStrictEqual('32px') - }) - it('点击新建应用,清空必输项,点击保存不生效,输入所有必输项,点击保存生效', async () => { - await page.getByRole('button', { name: '新建应用' }).click() - await page.locator('nz-form-label').filter({ hasText: '应用ID' }).click() - await page.locator('#id').click() - await page.locator('#id').fill('') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#name').click() - await page.locator('#name').fill('testForE2e') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#id').click() - await page.locator('#id').fill('1234567') - await page.getByRole('button', { name: '保存' }).click() - }) - it('点击新建应用,检查输入框样式,点击添加自定义属性并填入值,检查样式,点击header额外参数,检查样式,点击保存,保存生效并出现成功提示框', async () => { - await page.getByRole('button', { name: '新建应用' }).click() - - // 应用名称输入框样式 - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 应用ID输入框样式 - const idInput = await page.locator('input#id') - const idInputW = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const idInputH = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(idInputW).toStrictEqual('346px') - await expect(idInputH).toStrictEqual('32px') - - // 自定义属性样式 - const customFirstInput1 = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0') - const customFirstInput1W = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1PR = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const customFirstInput1H = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1W).toStrictEqual('182px') - await expect(customFirstInput1PR).toStrictEqual('8px') - await expect(customFirstInput1H).toStrictEqual('32px') - - const customFirstInput2 = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 1') - const customFirstInput2W = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput2PR = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const customFirstInput2H = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput2W).toStrictEqual('172px') - await expect(customFirstInput2PR).toStrictEqual('8px') - await expect(customFirstInput2H).toStrictEqual('32px') - - const customFirstBtn = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 2 >> button') - const customFirstBtnH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customFirstBtnLH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customFirstBtnColor = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customFirstBtnH).toStrictEqual('32px') - await expect(customFirstBtnLH).toStrictEqual('32px') - await expect(customFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - await customFirstBtn.click() - - const customFirstInput1A = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0') - const customFirstInput1AW = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1APR = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const customFirstInput1APB = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - const customFirstInput1AH = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1AW).toStrictEqual('182px') - await expect(customFirstInput1APR).toStrictEqual('8px') - await expect(customFirstInput1APB).toStrictEqual('16px') - await expect(customFirstInput1AH).toStrictEqual('48px') - - const customSecondBtn = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 0 >> tr >> nth = 2 >> td >> nth = 2 >> button >> nth = 0') - const customSecondBtnH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customSecondBtnLH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customSecondBtnColor = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customSecondBtnH).toStrictEqual('32px') - await expect(customSecondBtnLH).toStrictEqual('32px') - await expect(customSecondBtnColor).toStrictEqual('rgb(34, 84, 157)') - - // 描述样式 - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // Header额外参数样式 - const headerFirstInput1 = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 0') - const headerFirstInput1W = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1H = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1W).toStrictEqual('182px') - await expect(headerFirstInput1PR).toStrictEqual('8px') - await expect(headerFirstInput1H).toStrictEqual('32px') - - const headerFirstInput2 = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 1') - const headerFirstInput2W = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput2PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput2H = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput2W).toStrictEqual('172px') - await expect(headerFirstInput2PR).toStrictEqual('8px') - await expect(headerFirstInput2H).toStrictEqual('32px') - - const headerFirstBtn = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 2 >> button') - const headerFirstBtnH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerFirstBtnLH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerFirstBtnColor = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerFirstBtnH).toStrictEqual('32px') - await expect(headerFirstBtnLH).toStrictEqual('32px') - await expect(headerFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - await headerFirstBtn.click() - - const headerFirstInput1A = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 0') - const headerFirstInput1AW = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1APR = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1APB = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - const headerFirstInput1AH = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1AW).toStrictEqual('182px') - await expect(headerFirstInput1APR).toStrictEqual('8px') - await expect(headerFirstInput1APB).toStrictEqual('16px') - await expect(headerFirstInput1AH).toStrictEqual('48px') - - const headerSecondBtn = await page.locator('eo-ng-apinto-table.arrayItem >> nth = 1 >> tr >> nth = 2 >> td >> nth = 2 >> button >> nth = 0') - const headerSecondBtnH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerSecondBtnLH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerSecondBtnColor = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerSecondBtnH).toStrictEqual('32px') - await expect(headerSecondBtnLH).toStrictEqual('32px') - await expect(headerSecondBtnColor).toStrictEqual('rgb(34, 84, 157)') - - // 填写自定义属性与header参数并保存 - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0 >> input').click() - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0 >> input').fill('test') - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 1 >> input').click() - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 1 >> input').fill('1') - await page.locator('.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 0 >> input').click() - await page.locator('.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 0 >> input').fill('test2') - await page.locator('.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 1 >> input').click() - await page.locator('.arrayItem >> nth = 1 >> tr >> nth = 1 >> td >> nth = 1 >> input').fill('2') - - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0 >> input').click() - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 0 >> input').fill('test23') - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 1 >> input').click() - await page.locator('.arrayItem >> nth = 0 >> tr >> nth = 1 >> td >> nth = 1 >> input').fill('23') - - await page.getByText('用于转发上游系统鉴权').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#name').click() - await page.locator('#name').fill('testForE2e2') - await page.getByRole('button', { name: '保存' }).click() - }) - it('列表页点击匿名应用,进入匿名应用信息页,无鉴权管理tab', async () => { - await page.getByRole('cell', { name: '匿名应用' }).click() - expect(await page.getByRole('link', { name: '鉴权管理' }).isVisible()).toStrictEqual(false) - }) - it('上线管理列表的表格与上方间距12px,表格最后一列宽度为88px,检查不同状态的字体颜色', async () => { - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 6') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 6 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 6 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - - const onlineText = await page.getByText('已上线') - if (await onlineText && await onlineText.isVisible()) { - const onlineTextC = await onlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const onlineTextFW = await onlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(onlineTextC).toStrictEqual('rgb(19, 137, 19)') - expect(onlineTextFW).toStrictEqual('700') - } - - const notgoonlineText = await page.getByText('未上线') - if (await notgoonlineText && await notgoonlineText.isVisible()) { - const notgoonlineTextC = await notgoonlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const notgoonlineTextFW = await notgoonlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(notgoonlineTextC).toStrictEqual('rgb(143, 142, 147)') - expect(notgoonlineTextFW).toStrictEqual('700') - } - - const toUpdateText = await page.getByText('待更新') - if (await toUpdateText && await toUpdateText.isVisible()) { - const toUpdateTextC = await toUpdateText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const toUpdateTextFW = await toUpdateText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(toUpdateTextC).toStrictEqual('rgb(3, 169, 244)') - expect(toUpdateTextFW).toStrictEqual('700') - } - - const offlineText = await page.getByText('已下线') - if (await offlineText && await offlineText.isVisible()) { - const offlineTextC = await offlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const offlineTextFW = await offlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(offlineTextC).toStrictEqual('rgb(143, 142, 147)') - expect(offlineTextFW).toStrictEqual('700') - } - const disabledText = await page.getByText('已禁用') - if (await disabledText && await disabledText.isVisible()) { - const disabledTextC = await disabledText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const disabledTextFW = await disabledText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(disabledTextC).toStrictEqual('rgb(255, 59, 48)') - expect(disabledTextFW).toStrictEqual('700') - } - - const enabledText = await page.getByText('未禁用') - if (await enabledText && await enabledText.isVisible()) { - const enabledTextC = await enabledText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const enabledTextFW = await enabledText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(enabledTextC).toStrictEqual('rgb(19, 137, 19)') - expect(enabledTextFW).toStrictEqual('700') - } - }) - it('点击应用信息,检查输入框样式,其中应用名称与应用ID为不可修改,点击提交返回列表页', async () => { - await page.getByRole('link', { name: '应用信息' }).click() - - // 应用名称输入框样式 - const nameInput = await page.locator('input#name') - const nameInputDisabled = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - await expect(nameInputDisabled).toStrictEqual('') - - // 应用ID输入框样式 - const idInput = await page.locator('input#id') - const idInputDisabled = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(idInputDisabled).toStrictEqual('') - - await page.getByRole('button', { name: '提交' }).click() - }) - it('点击非匿名应用一行的查看图标,进入应用信息页,点击进入鉴权管理,鉴权管理按钮为primary,检查大小、间距', async () => { - // await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 5 >> button >> nth = 0').click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 4').click() - await page.getByRole('link', { name: '鉴权管理' }).click() - - const createBtn = await page.getByRole('button', { name: '配置鉴权' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - // const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - // const listTableIconThPadding = await listTableIconTh.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding')) - // expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - // const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - // const listTableIcon1PL = await listTableIcon1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-left')) - // const listTableIcon1PR = await listTableIcon1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-right')) - // expect(listTableIcon1PL).toStrictEqual('0px') - // expect(listTableIcon1PR).toStrictEqual('8px') - - // const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - // const listTableIcon2PL = await listTableIcon2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-left')) - // const listTableIcon2PR = await listTableIcon2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-right')) - // expect(listTableIcon2PL).toStrictEqual('8px') - // expect(listTableIcon2PR).toStrictEqual('0px') - }) - it('点击按钮配置鉴权,出现弹窗,检查弹窗样式,检查basic鉴权的输入框样式', async () => { - await page.getByRole('button', { name: '配置鉴权' }).click() - await page.waitForTimeout(2000) - - // 弹窗样式 - const drawerTitle = await page.locator('.ant-drawer-header') - const drawerTitleP = await drawerTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerTitleW = await drawerTitle.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(drawerTitleP).toStrictEqual('15px 20px') - expect(drawerTitleW).toStrictEqual('676px') - - // 透传上游样式 - const continueSwitch = await page.locator('eo-ng-switch >> button') - const continueSwitchW = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const continueSwitchH = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(continueSwitchW).toStrictEqual('35px') - await expect(continueSwitchH).toStrictEqual('16px') - - // 鉴权类型选择框样式 - const driverSelect = await page.locator('#driver eo-ng-select-top-control') - const driverSelectW = await driverSelect.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const driverSelectH = await driverSelect.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(driverSelectW).toStrictEqual('346px') - await expect(driverSelectH).toStrictEqual('32px') - - // 参数位置样式 - const headerSelect = await page.locator('#position eo-ng-select-top-control') - const headerSelectW = await headerSelect.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerSelectH = await headerSelect.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerSelectW).toStrictEqual('132px') - await expect(headerSelectH).toStrictEqual('32px') - - const tokenInput = await page.getByPlaceholder('请输入TokenName') - const tokenInputW = await tokenInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const tokenInputH = await tokenInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(tokenInputW).toStrictEqual('215px') - await expect(tokenInputH).toStrictEqual('32px') - - // 用户名样式 - const usernameInput = await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文') - const usernameInputW = await usernameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const usernameInputH = await usernameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(usernameInputW).toStrictEqual('346px') - await expect(usernameInputH).toStrictEqual('32px') - - // 密码样式 - - const pswInput = await page.locator('section').filter({ hasText: '*密码' }).getByPlaceholder('请输入') - const pswInputW = await pswInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const pswInputH = await pswInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(pswInputW).toStrictEqual('346px') - await expect(pswInputH).toStrictEqual('32px') - - // 标签信息样式 - const customFirstInput1 = await page.locator('#params0key') - const customFirstInput1W = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1H = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1W).toStrictEqual('210px') - await expect(customFirstInput1H).toStrictEqual('32px') - - const customFirstInput2 = await page.locator('.ant-space > div:nth-child(2) >> nth = 0') - const customFirstInput2W = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput2H = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput2W).toStrictEqual('218px') - await expect(customFirstInput2H).toStrictEqual('52px') - - const customFirstBtn = await page.locator('#dynamic a').first() - const customFirstBtnH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customFirstBtnLH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customFirstBtnColor = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customFirstBtnH).toStrictEqual('32px') - await expect(customFirstBtnLH).toStrictEqual('32px') - await expect(customFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const customFirstInput1A = await page.locator('#params1key') - const customFirstInput1AW = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1AH = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1AW).toStrictEqual('210px') - await expect(customFirstInput1AH).toStrictEqual('32px') - - const customSecondBtn = await page.locator('div:nth-child(2) > .ant-space > div:nth-child(3)') - const customSecondBtnH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customSecondBtnW = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - - await expect(customSecondBtnH).toStrictEqual('55.4286px') - await expect(customSecondBtnW).toStrictEqual('32px') - - // 过期时间样式 - const expireInput = await page.locator('#expireTime') - const expireInputW = await expireInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const expireInputH = await expireInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(expireInputW).toStrictEqual('346px') - await expect(expireInputH).toStrictEqual('32px') - - // 每一行的间隙 - const mg1 = await page.locator('nz-form-item >> nth = 0') - const mg1MT = await mg1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg1MT).toStrictEqual('20px') - - const mg2 = await page.locator('nz-form-item >> nth = 1') - const mg2MT = await mg2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg2MT).toStrictEqual('20px') - - const mg3 = await page.locator('nz-form-item >> nth = 2') - const mg3MT = await mg3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg3MT).toStrictEqual('20px') - - const mg4 = await page.locator('nz-form-item >> nth = 3') - const mg4MT = await mg4.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg4MT).toStrictEqual('0px') - - const mg5 = await page.locator('nz-form-item >> nth = 4') - const mg5MT = await mg5.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg5MT).toStrictEqual('20px') - - const mg6 = await page.locator('nz-form-item >> nth = 5') - const mg6MT = await mg6.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(mg6MT).toStrictEqual('20px') - }) - it('未填写必填项时,点击保存不生效;填写完必输项,点击保存后出现消息提示,并返回列表页', async () => { - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('button', { name: '关' }).click() - await page.getByText('Header').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'Query' }).click() - await page.getByPlaceholder('请输入TokenName').click() - await page.getByPlaceholder('请输入TokenName').fill('Authorization1') - await page.locator('#params0key').click() - await page.locator('#params0key').fill('teest') - await page.locator('#params0value').click() - await page.locator('#params0value').fill('1') - await page.locator('section').filter({ hasText: '*密码 必填项' }).getByPlaceholder('请输入').click() - await page.locator('section').filter({ hasText: '*密码 必填项' }).getByPlaceholder('请输入').fill('test') - await page.locator('#expireTime div').first().click() - await page.getByRole('gridcell', { name: '24' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('success').click() - }) - it('配置鉴权选择apikey,检查样式', async () => { - await page.getByRole('button', { name: '配置鉴权' }).click() - await page.locator('#driver').getByText('Basic').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'ApiKey' }).click() - await page.waitForTimeout(2000) - - // apikey样式 - const apikeyInput = await page.locator('section section >> nth = 0 >> input') - const apikeyInputW = await apikeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const apikeyInputH = await apikeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(apikeyInputW).toStrictEqual('346px') - await expect(apikeyInputH).toStrictEqual('32px') - - // 标签信息样式 - const customFirstInput1 = await page.locator('#params0key') - const customFirstInput1W = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1H = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1W).toStrictEqual('210px') - await expect(customFirstInput1H).toStrictEqual('32px') - - const customFirstInput2 = await page.locator('.ant-space > div:nth-child(2) >> nth = 0') - const customFirstInput2W = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput2H = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput2W).toStrictEqual('218px') - await expect(customFirstInput2H).toStrictEqual('52px') - - const customFirstBtn = await page.locator('#dynamic a').first() - const customFirstBtnH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customFirstBtnLH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customFirstBtnColor = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customFirstBtnH).toStrictEqual('32px') - await expect(customFirstBtnLH).toStrictEqual('32px') - await expect(customFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const customFirstInput1A = await page.locator('#params1key') - const customFirstInput1AW = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1AH = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1AW).toStrictEqual('210px') - await expect(customFirstInput1AH).toStrictEqual('32px') - - const customSecondBtn = await page.locator('div:nth-child(2) > .ant-space > div:nth-child(3)') - const customSecondBtnH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customSecondBtnW = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - - await expect(customSecondBtnH).toStrictEqual('55.4286px') - await expect(customSecondBtnW).toStrictEqual('32px') - }) - it('未填写必填项时,点击保存不生效;填写完必输项,点击保存后出现消息提示,并返回列表页', async () => { - await page.getByRole('button', { name: '保存' }).click() - await page.locator('section section >> nth = 0 >> input').click() - await page.locator('section section >> nth = 0 >> input').fill('TEST') - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('success').click() - }) - it('配置鉴权选择aksk,检查样式', async () => { - await page.getByRole('button', { name: '配置鉴权' }).click() - await page.locator('#driver').getByText('Basic').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'AkSk' }).click() - await page.waitForTimeout(2000) - - // ak样式 - const akInput = await page.locator('section').filter({ hasText: '*AK' }).getByPlaceholder('请输入') - const akInputW = await akInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const akInputH = await akInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(akInputW).toStrictEqual('346px') - await expect(akInputH).toStrictEqual('32px') - - // sk样式 - const skInput = await page.locator('section').filter({ hasText: '*AK' }).getByPlaceholder('请输入') - const skInputW = await skInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const skInputH = await skInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(skInputW).toStrictEqual('346px') - await expect(skInputH).toStrictEqual('32px') - - // 标签信息样式 - const customFirstInput1 = await page.locator('#params0key') - const customFirstInput1W = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1H = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1W).toStrictEqual('210px') - await expect(customFirstInput1H).toStrictEqual('32px') - - const customFirstInput2 = await page.locator('.ant-space > div:nth-child(2) >> nth = 0') - const customFirstInput2W = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput2H = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput2W).toStrictEqual('218px') - await expect(customFirstInput2H).toStrictEqual('52px') - - const customFirstBtn = await page.locator('#dynamic a').first() - const customFirstBtnH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customFirstBtnLH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customFirstBtnColor = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customFirstBtnH).toStrictEqual('32px') - await expect(customFirstBtnLH).toStrictEqual('32px') - await expect(customFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const customFirstInput1A = await page.locator('#params1key') - const customFirstInput1AW = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1AH = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1AW).toStrictEqual('210px') - await expect(customFirstInput1AH).toStrictEqual('32px') - - const customSecondBtn = await page.locator('div:nth-child(2) > .ant-space > div:nth-child(3)') - const customSecondBtnH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customSecondBtnW = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - - await expect(customSecondBtnH).toStrictEqual('55.4286px') - await expect(customSecondBtnW).toStrictEqual('32px') - }) - it('未填写必填项时,点击保存不生效;填写完必输项,点击保存后出现消息提示,并返回列表页', async () => { - await page.getByRole('button', { name: '保存' }).click() - await page.locator('section').filter({ hasText: '*AK 必填项' }).getByPlaceholder('请输入').click() - await page.locator('section').filter({ hasText: '*AK 必填项' }).getByPlaceholder('请输入').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('section').filter({ hasText: '*SK 必填项' }).getByPlaceholder('请输入').click() - await page.locator('section').filter({ hasText: '*SK 必填项' }).getByPlaceholder('请输入').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('success').click() - }) - it('配置鉴权选择jwt,检查样式', async () => { - await page.getByRole('button', { name: '配置鉴权' }).click() - await page.locator('#driver').getByText('Basic').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'Jwt' }).click() - await page.waitForTimeout(2000) - - // 算法输入框样式 - const algoInput = await page.locator('#dynamic eo-ng-select-top-control') - const algoInputW = await algoInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const algoInputH = await algoInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(algoInputW).toStrictEqual('346px') - await expect(algoInputH).toStrictEqual('32px') - - // ISS样式 - const issInput = await page.locator('section').filter({ hasText: '*Iss' }).getByPlaceholder('请输入') - const issInputW = await issInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const issInputH = await issInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(issInputW).toStrictEqual('346px') - await expect(issInputH).toStrictEqual('32px') - - // secret样式 - const secretInput = await page.locator('section').filter({ hasText: '*Secret' }).getByPlaceholder('请输入') - const secretInputW = await secretInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const secretInputH = await secretInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(secretInputW).toStrictEqual('346px') - await expect(secretInputH).toStrictEqual('32px') - - // 标签信息样式 - const customFirstInput1 = await page.locator('#params0key') - const customFirstInput1W = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1H = await customFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1W).toStrictEqual('210px') - await expect(customFirstInput1H).toStrictEqual('32px') - - const customFirstInput2 = await page.locator('.ant-space > div:nth-child(2) >> nth = 0') - const customFirstInput2W = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput2H = await customFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput2W).toStrictEqual('218px') - await expect(customFirstInput2H).toStrictEqual('52px') - - const customFirstBtn = await page.locator('#dynamic a').first() - const customFirstBtnH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customFirstBtnLH = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const customFirstBtnColor = await customFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(customFirstBtnH).toStrictEqual('32px') - await expect(customFirstBtnLH).toStrictEqual('32px') - await expect(customFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const customFirstInput1A = await page.locator('#params1key') - const customFirstInput1AW = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const customFirstInput1AH = await customFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(customFirstInput1AW).toStrictEqual('210px') - await expect(customFirstInput1AH).toStrictEqual('32px') - - const customSecondBtn = await page.locator('div:nth-child(2) > .ant-space > div:nth-child(3)') - const customSecondBtnH = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const customSecondBtnW = await customSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - - await expect(customSecondBtnH).toStrictEqual('55.4286px') - await expect(customSecondBtnW).toStrictEqual('32px') - }) - it('未填写必填项时,点击保存不生效;填写完必输项,点击保存后出现消息提示,并返回列表页', async () => { - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('HS256').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'HS512' }).click() - await page.getByText('HS512').click() - await page.locator('eo-ng-option-item').filter({ hasText: 'ES256' }).click() - await page.locator('section').filter({ hasText: '*Iss 必填项' }).getByPlaceholder('请输入').click() - await page.locator('section').filter({ hasText: '*Iss 必填项' }).getByPlaceholder('请输入').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('section').filter({ hasText: '*RsaPublicKey 必填项' }).getByPlaceholder('请输入').click() - await page.locator('section').filter({ hasText: '*RsaPublicKey 必填项' }).getByPlaceholder('请输入').fill('t') - await page.locator('section').filter({ hasText: '*RsaPublicKey' }).getByPlaceholder('请输入').fill('test') - await page.getByRole('button', { name: '保存' }).click() - }) - it('点击列表中的basic,编辑并保存', async () => { - await page.getByRole('cell', { name: 'Basic' }).nth(1).click() - await page.getByRole('button', { name: '开' }).click() - await page.getByRole('button', { name: '关' }).click() - await page.getByRole('button', { name: '保存' }).click() - }) - it('点击列表中aksk的查看按钮,编辑并保存', async () => { - // await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0').click() - // await page.getByRole('button', { name: '保存' }).click() - }) - it('点击列表中jwt的删除按钮,点击删除,列表将减少一行', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1').click() - // await page.getByRole('button', { name: '确定' }).click() - // expect(await (await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - }) - it('点击列表中apikey的删除按钮,点击取消,列表行数不变', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1').click() - // await page.getByRole('button', { name: '取消' }).click() - // expect(await (await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - }) - it('点击tabs,测试页面是否切换', async () => { - await page.getByRole('link', { name: '应用信息' }).click() - await page.getByText('用于转发上游系统鉴权').click() - await page.getByRole('link', { name: '上线管理' }).click() - await page.getByRole('columnheader', { name: '集群名称' }).click() - await page.getByRole('link', { name: '鉴权管理' }).click() - await page.getByRole('columnheader', { name: '鉴权信息' }).click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/application/message/message.component.spec.ts b/frontend/projects/core/src/app/layout/application/message/message.component.spec.ts deleted file mode 100644 index da4b500f5..000000000 --- a/frontend/projects/core/src/app/layout/application/message/message.component.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { ApplicationManagementListComponent } from '../list/list.component' -import { ApplicationMessageComponent } from './message.component' -import { ApplicationCreateComponent } from '../create/create.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('ApplicationMessageComponent test', () => { - let component: ApplicationMessageComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ApplicationManagementListComponent - }, - { - path: 'message', - component: ApplicationMessageComponent - }, - { - path: 'create', - component: ApplicationCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ApplicationMessageComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/application/types/conf.ts b/frontend/projects/core/src/app/layout/application/types/conf.ts index d3dba2853..70adcbfba 100644 --- a/frontend/projects/core/src/app/layout/application/types/conf.ts +++ b/frontend/projects/core/src/app/layout/application/types/conf.ts @@ -229,53 +229,3 @@ export const extraConflictList:SelectOption[] = [ value: 'error' } ] - -export const extraTableHeadName:THEAD_TYPE[] = [ - { title: '参数位置' }, - { title: '参数名' }, - { title: '参数值' }, - { title: '生效规则' }, - { - title: '操作', - right: true - } -] - -export const extraTableBody:EO_TBODY_TYPE[] = [ - { - key: 'position' - }, - { - key: 'key' - }, - { key: 'value' }, - { - key: 'conflict' - }, - { - type: 'btn', - right: true, - btns: [ - { - title: '修改' - }, - { - title: '删除' - } - ] - }] - -export const extraConflictList:SelectOption[] = [ - { - label: '替换原参数值', - value: 'convert' - }, - { - label: '原参数值不存在时,添加额外参数', - value: 'origin' - }, - { - label: '原参数值存在时返回错误', - value: 'error' - } -] diff --git a/frontend/projects/core/src/app/layout/audit-log/audit-log.component.test.ts b/frontend/projects/core/src/app/layout/audit-log/audit-log.component.test.ts deleted file mode 100644 index ca683d808..000000000 --- a/frontend/projects/core/src/app/layout/audit-log/audit-log.component.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -describe('审计日志 e2e test', () => { - it('初始化进入审计日志页面', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByRole('link', { name: '审计日志' }).click() - }) - - it('检查面包屑、页面样式', async () => { - // 面包屑样式 面包屑审计日志,字号14,字体颜色为主题色 - const breadcrumbItem = await page.locator('nz-breadcrumb-item').getByText('审计日志') - const breadcrumbItemFS = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(breadcrumbItemFS).toStrictEqual('14px') - const breadcrumbItemC = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(breadcrumbItemC).toStrictEqual('rgb(34, 84, 157)') - - // 输入框样式 - const groupInput1 = await page.getByText('操作类型 请选择 操作对象 请选择 搜索内容') - const groupInput1ML = await groupInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - await expect(groupInput1ML).toStrictEqual('16px') - - const operTypeInput = await page.locator('eo-ng-select').first() - const operTypeInputW = await operTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const operTypeInputH = await operTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const operTypeInputML = await operTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(operTypeInputW).toStrictEqual('254px') - await expect(operTypeInputH).toStrictEqual('32px') - await expect(operTypeInputML).toStrictEqual('12px') - - const labelTarget = await page.locator('label').filter({ hasText: '操作对象' }) - const labelTargetML = await labelTarget.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - await expect(labelTargetML).toStrictEqual('24px') - - const operTargetInput = await page.locator('eo-ng-select >> nth = 1') - const operTargetInputW = await operTargetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const operTargetInputH = await operTargetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const operTargetInputML = await operTargetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(operTargetInputW).toStrictEqual('254px') - await expect(operTargetInputH).toStrictEqual('32px') - await expect(operTargetInputML).toStrictEqual('12px') - - const labelSearch = await page.locator('label').filter({ hasText: '搜索内容' }) - const labelSearchML = await labelSearch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - await expect(labelSearchML).toStrictEqual('24px') - - const searchInput = await page.locator('eo-ng-input-group').first() - const searchInputW = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInputML = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(searchInputW).toStrictEqual('254px') - await expect(searchInputH).toStrictEqual('32px') - await expect(searchInputML).toStrictEqual('12px') - - const groupInput2 = await page.getByText('操作类型 请选择 操作对象 请选择 搜索内容') - const groupInput2ML = await groupInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - await expect(groupInput2ML).toStrictEqual('16px') - - const operTimeInput = await page.locator('nz-range-picker') - const operTimeInputW = await operTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const operTimeInputH = await operTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const operTimeInputML = await operTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - await expect(operTimeInputW).toStrictEqual('254px') - await expect(operTimeInputH).toStrictEqual('32px') - await expect(operTimeInputML).toStrictEqual('12px') - - // 查询按钮样式 - const searchBtn = await page.getByRole('button', { name: '查询' }) - const searchBtnH = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchBtnW = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchBtnBG = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const searchBtnBC = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchBtnFS = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const searchBtnML = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(searchBtnH).toStrictEqual('32px') - expect(searchBtnW).toStrictEqual('54px') - expect(searchBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(searchBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(searchBtnFS).toStrictEqual('14px') - expect(searchBtnML).toStrictEqual('12px') - - // 取消按钮样式 - const resetBtn = await page.getByRole('button', { name: '重置' }) - const resetBtnH = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const resetBtnW = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const resetBtnBG = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const resetBtnBC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const resetBtnFS = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const resetBtnML = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(resetBtnH).toStrictEqual('32px') - expect(resetBtnW).toStrictEqual('54px') - expect(resetBtnBG).toStrictEqual('rgb(255, 255, 255)') - expect(resetBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(resetBtnFS).toStrictEqual('14px') - expect(resetBtnML).toStrictEqual('24px') - - // 整体布局 - const header = await page.locator('.list-header') - const headerPT = await header.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(headerPT).toStrictEqual('12px') - - const content = await page.locator('.list-content') - const contentMT = await content.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - const contentPB = await content.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - expect(contentMT).toStrictEqual('12px') - expect(contentPB).toStrictEqual('20px') - - const pagination = await page.locator('.mg_pagination_t') - const paginationPT = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(paginationPT).toStrictEqual('16px') - - // 表格样式 - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.getByRole('columnheader', { name: '用户名' }) - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.getByRole('columnheader', { name: '操作类型' }) - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - // const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 5 ') - // const listTableIconThPadding = await listTableIconTh.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding')) - // expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - // const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 5 >> button >> nth = 0') - // const listTableIcon1PL = await listTableIcon1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-left')) - // const listTableIcon1PR = await listTableIcon1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('padding-right')) - // expect(listTableIcon1PL).toStrictEqual('0px') - // expect(listTableIcon1PR).toStrictEqual('0px') - }) - it('点击某一行,检查弹窗样式,点击关闭', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 0 ').click() - await page.getByText('日志详情').click() - const drawerTable = await page.locator('.drawer-table') - const drawerTableP = await drawerTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerTableM = await drawerTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(drawerTableP).toStrictEqual('0px') - expect(drawerTableM).toStrictEqual('0px auto') - - const drawerListTable = await page.locator('.drawer-list-content') - const drawerListTableP = await drawerListTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(drawerListTableP).toStrictEqual('0px 0px 20px') - - // 取消按钮样式 - const resetBtn = await page.getByRole('button', { name: '取消' }) - const resetBtnH = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const resetBtnW = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const resetBtnBG = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const resetBtnBC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const resetBtnFS = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const resetBtnM = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - - expect(resetBtnH).toStrictEqual('32px') - expect(resetBtnW).toStrictEqual('54px') - expect(resetBtnBG).toStrictEqual('rgb(255, 255, 255)') - expect(resetBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(resetBtnFS).toStrictEqual('14px') - expect(resetBtnM).toStrictEqual('0px') - - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击某一行的查看图标,点击取消', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 0 ').click() - // await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 5 >> button ').click() - - await page.getByRole('button', { name: 'Close' }).click() - }) - it('测试查询与重置功能', async () => { - await page.locator('eo-ng-select-top-control').first().click() - await page.locator('.cdk-overlay-pane').getByText('新建').click() - await page.locator('nz-select-item').filter({ hasText: '新建' }).click() - await page.locator('.cdk-overlay-pane').getByText('编辑').click() - await page.locator('nz-select-item').filter({ hasText: '编辑' }).click() - await page.locator('.cdk-overlay-pane').getByText('删除').click() - await page.locator('nz-select-item').filter({ hasText: '删除' }).click() - await page.locator('.cdk-overlay-pane').getByText('发布').click() - await page.locator('nz-select-item').filter({ hasText: '发布' }).click() - await page.locator('eo-ng-select').filter({ hasText: '发布' }).locator('nz-select-clear svg').click() - await page.locator('eo-ng-select-top-control').nth(1).click() - await page.locator('eo-ng-option-item').filter({ hasText: 'API' }).first().click() - await page.locator('nz-select-clear svg').click() - await page.locator('eo-ng-input-group').click() - await page.getByPlaceholder('请输入用户名或请求IP').click() - await page.getByPlaceholder('请输入用户名或请求IP').fill('TET') - await page.getByPlaceholder('开始日期').click() - await page.getByRole('row', { name: '28 29 30 1 2 3 4' }).getByText('2').nth(2).click() - await page.getByText('00').first().click() - await page.getByText('21').nth(3).click() - await page.getByRole('listitem').filter({ hasText: '确定' }).click() - await page.getByRole('row', { name: '26 27 28 29 30 31 1' }).getByText('30').click() - await page.getByText('00').nth(1).click() - await page.getByText('21').nth(3).click() - await page.getByRole('button', { name: '确定' }).click() - await page.getByRole('button', { name: '查询' }).click() - - await page.getByRole('button', { name: '重置' }).click() - await page.locator('eo-ng-select-top-control').first().click() - await page.locator('eo-ng-option-item').filter({ hasText: '编辑' }).click() - await page.locator('eo-ng-select-top-control').filter({ hasText: '请选择' }).click() - await page.locator('.cdk-overlay-pane').getByText('上游').click() - await page.locator('eo-ng-input-group').click() - await page.getByText('操作类型编辑操作对象上游搜索内容操作时间 重置 查询').click() - await page.getByPlaceholder('开始日期').click() - await page.getByRole('row', { name: '28 29 30 1 2 3 4' }).getByText('2').nth(2).click() - await page.getByText('00').first().click() - await page.getByText('00').nth(2).click() - await page.getByText('00').nth(3).click() - await page.getByText('21').nth(1).click() - await page.getByText('01').first().click() - await page.getByText('00').nth(1).click() - await page.getByText('01').first().click() - await page.getByRole('button', { name: '确定' }).click() - await page.getByText('23').nth(1).click() - await page.getByRole('button', { name: '确定' }).click() - await page.getByRole('button', { name: '查询' }).click() - await page.locator('eo-ng-select-top-control').filter({ hasText: '上游' }).click() - await page.locator('eo-ng-option-item').filter({ hasText: '上游' }).click() - await page.getByRole('button', { name: '查询' }).click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/audit-log/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/audit-log/list/list.component.spec.ts deleted file mode 100644 index d01dcde62..000000000 --- a/frontend/projects/core/src/app/layout/audit-log/list/list.component.spec.ts +++ /dev/null @@ -1,503 +0,0 @@ -/* eslint-disable dot-notation */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, LOCALE_ID } from '@angular/core' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' - -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' - -import { EoNgSelectModule } from 'eo-ng-select' -import { AuditLogListComponent } from './list.component' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { EoNgInputModule } from 'eo-ng-input' -import { EoNgButtonModule } from 'eo-ng-button' -import { EoNgTableModule } from 'eo-ng-table' -import { EoNgDatePickerModule } from 'eo-ng-date-picker' -// import { NzDatePickerModule } from 'ng-zorro-antd/date-picker' -import { NZ_DATE_LOCALE } from 'ng-zorro-antd/i18n' - -import { APP_BASE_HREF, registerLocaleData } from '@angular/common' -import zh from '@angular/common/locales/zh' -registerLocaleData(zh) - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('AuditLogListComponent test', () => { - let component: AuditLogListComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - EoNgSelectModule, - FormsModule, - ReactiveFormsModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - EoNgInputModule, - EoNgButtonModule, - HttpClientModule, - EoNgTableModule, - EoNgDatePickerModule - // NzDatePickerModule - ], - declarations: [AuditLogListComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { provide: NZ_DATE_LOCALE, useValue: zh }, - { - provide: LOCALE_ID, - useValue: 'zh-CN' - }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(AuditLogListComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getLogList and getTargetList ', () => { - const spyGetLogList = jest.spyOn(component, 'getLogList') - const spyGetTargetList = jest.spyOn(component, 'getTargetList') - expect(spyGetLogList).not.toHaveBeenCalled() - expect(spyGetTargetList).not.toHaveBeenCalled() - - component.ngOnInit() - fixture.detectChanges() - expect(spyGetLogList).toHaveBeenCalled() - expect(spyGetTargetList).toHaveBeenCalled() - }) - - it('##getLogList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - items: [{ - id: 0, - operator: { - user_id: 0, - keyword: '', - nickname: '', - avatar: '' - }, - operateType: '', - kind: '', - time: '', - ip: '' - }], - total: 1 - }, - msg: '' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getLogList() - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - expect(spyService).toBeCalledWith('audit-logs', { - keyword: '', - operateType: '', - kind: '', - end: Math.floor(new Date().getTime() / 1000), - pageSize: 20, - pageNum: 1, - total: 0 - }) - - expect(component.logsList).toStrictEqual([{ - id: 0, - eoKey: 123456789, - operator: { - user_id: 0, - keyword: '', - nickname: '', - avatar: '' - }, - operateType: '', - kind: '', - time: '', - ip: '' - }]) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getLogList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.searchData = { - keyword: 'test', - operateType: 'test1', - kind: 'test2', - start: new Date(), - end: null, - pageSize: 20, - pageNum: 1, - total: 0 - } - component.getLogList() - fixture.detectChanges() - - expect(spyService).toBeCalledWith('audit-logs', { - keyword: 'test', - operateType: 'test1', - kind: 'test2', - start: Math.floor(new Date().getTime() / 1000), - end: Math.floor(new Date().getTime() / 1000), - pageSize: 20, - pageNum: 1, - total: 0 - }) - - expect(component.logsList).toStrictEqual([]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getLogList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.searchData = { - keyword: 'test', - operateType: 'test1', - kind: 'test2', - start: new Date(), - end: new Date(1667447768000), - pageSize: 20, - pageNum: 1, - total: 0 - } - component.getLogList() - fixture.detectChanges() - - expect(spyService).toBeCalledWith('audit-logs', { - keyword: 'test', - operateType: 'test1', - kind: 'test2', - start: Math.floor(new Date().getTime() / 1000), - end: Math.floor(new Date(1667447768000).getTime() / 1000), - pageSize: 20, - pageNum: 1, - total: 0 - }) - - expect(component.logsList).toStrictEqual([]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取列表数据失败!') - }) - - it('##getTargetList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - items: [{ - title: '1', - name: '2' - }, - { - title: '2', - name: '3' - }, - { - title: '3', - name: '4' - }] - }, - msg: 'success' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getTargetList() - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - expect(spyService).toBeCalledWith('audit-log/kinds') - - expect(component.listOfKind).toStrictEqual([{ - title: '1', - value: '2', - label: '1', - name: '2' - }, - { - title: '2', - value: '3', - label: '2', - name: '3' - }, - { - title: '3', - value: '4', - label: '3', - name: '4' - }]) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getTargetList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getTargetList() - fixture.detectChanges() - - expect(spyService).toBeCalledWith('audit-log/kinds') - - expect(component.listOfKind).toStrictEqual([]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('fail') - }) - - it('##getTargetList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getTargetList() - fixture.detectChanges() - - expect(spyService).toBeCalledWith('audit-log/kinds') - - expect(component.logsList).toStrictEqual([]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取操作对象数据失败!') - }) - - it('##getLogDetail with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - args: [{ - attr: '1', - value: '12' - }, - { - attr: '2', - value: '22' - }, - { - attr: '3', - value: '32' - }] - }, - msg: '' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyOpenDrawer = jest.spyOn(component, 'openDrawer') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyOpenDrawer).not.toHaveBeenCalled() - - component.getLogDetail({ id: 'testId' }) - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - - expect(component.auditLogDetail).toStrictEqual([{ - attr: '1', - value: '12', - eoKey: 123456789 - }, - { - attr: '2', - value: '22', - eoKey: 123456789 - }, - { - attr: '3', - value: '32', - eoKey: 123456789 - }]) - expect(spyOpenDrawer).toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyService).toHaveBeenCalledWith('audit-log', { logId: 'testId' }) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getLogDetail with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.logsTableClick({ data: { id: 'testId' } }) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('fail') - }) - - it('##getLogDetail with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.logsTableBody[5].btns[0].click({ id: 'testId' }) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取日志详情失败!') - }) - - it('##openDrawer', () => { - expect(component.drawerRef).toBeUndefined() - - component.openDrawer() - fixture.detectChanges() - expect(component.drawerRef).not.toBeUndefined() - }) - - it('##clearSearch test', fakeAsync(() => { - component.searchData = { - keyword: '123', - operateType: '213', - kind: '32123', - start: null, - end: null, - pageSize: 20, - pageNum: 1, - total: 0 - } - component.date = [1, 2] - - component.clearSearch() - - expect(component.searchData).toStrictEqual({ - keyword: '', - operateType: '', - kind: '', - start: null, - end: null, - pageSize: 20, - pageNum: 1, - total: 0 - }) - - expect(component.date).toStrictEqual([]) - })) - - it('##onDateRangeChange test', fakeAsync(() => { - expect(component.searchData.start).toStrictEqual(null) - expect(component.searchData.end).toStrictEqual(null) - - component.onDateRangeChange([new Date(111111111), new Date()]) - expect(component.searchData.start).toStrictEqual(new Date(111111111)) - expect(component.searchData.end).toStrictEqual(new Date()) - - component.onDateRangeChange([new Date(22222), new Date(2222222222232)]) - expect(component.searchData.start).toStrictEqual(new Date(22222)) - expect(component.searchData.end).toStrictEqual(new Date(2222222222232)) - })) -}) diff --git a/frontend/projects/core/src/app/layout/auth/auth.component.test.ts b/frontend/projects/core/src/app/layout/auth/auth.component.test.ts deleted file mode 100644 index 5a753b2e9..000000000 --- a/frontend/projects/core/src/app/layout/auth/auth.component.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -describe('商业授权 e2e test', () => { - it('登陆前进入auth页面,检查样式;上传证书后进入auth信息查询页,检查样式', async () => { - await page.goto('http://localhost:4200/auth') - - const activationBlock = await page.locator('.activation-block') - const activationBlockW = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const activationBlockBGC = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const activationBlockMT = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - const activationBlockP = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(activationBlockW).toStrictEqual('760px') - expect(activationBlockBGC).toStrictEqual('rgb(248, 248, 250)') - expect(activationBlockMT).toStrictEqual('10vh') - expect(activationBlockP).toStrictEqual('54px 0px') - - const title = await page.getByRole('heading', { name: '激活系统' }) - const titleFrontSize = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const titleFrontWeight = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - const titleFrontTA = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('text-align')) - expect(titleFrontSize).toStrictEqual('24px') - expect(titleFrontWeight).toStrictEqual('700') - expect(titleFrontTA).toStrictEqual('center') - - const activationContent = await page.locator('.activation-content') - const activationContentM = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const activationContentC = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const activationContentFS = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const activationContentFW = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - const activationContentLH = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const activationContentLST = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('list-style-type')) - expect(activationContentM).toStrictEqual('40px auto 0px auto') - expect(activationContentC).toStrictEqual('rgb(51, 51, 51)') - expect(activationContentFS).toStrictEqual('14px') - expect(activationContentFW).toStrictEqual('500') - expect(activationContentLH).toStrictEqual('26px') - expect(activationContentLST).toStrictEqual('none') - - const listContent = await page.locator('.list-content') - const listContentML = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(listContentML).toStrictEqual('28px') - - const activationButtonDisabled = await (await page.getByRole('button', { name: '激活系统' })).evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - expect(activationButtonDisabled).toStrictEqual('true') - - await page.getByRole('button', { name: '复制' }).click() - await page.getByText('复制成功').click() - await page.setInputFiles('button:has-text("上传证书")', './test/apinto-2027.cert') - await page.getByRole('button', { name: '激活系统' }).click() - - await page.getByRole('heading', { name: '标准版授权' }).click() - - const activationInfo = await page.locator('.activation-info') - const activationInfoC = await activationInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(activationInfoC).toStrictEqual('rgb(102, 102, 102)') - - const goToLogin = await page.locator('.auth-a') - const goToLoginM = await goToLogin.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const goToLoginTL = await goToLogin.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('text-align')) - expect(goToLoginM).toStrictEqual('rgb(24px auto 0px auto)') - expect(goToLoginTL).toStrictEqual('center') - await page.getByText('跳转至登录页').click() - }) - it('点击登录,进入登录页,从左侧下方进入授权页面', async () => { - if (await page.getByRole('heading', { name: '欢迎来到 Apinto' }) && await page.getByRole('heading', { name: '欢迎来到 Apinto' }).isVisible()) { - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByRole('button', { name: '登录' }).click() - await page.getByText('版权所有 © 银云信息技术').click() - } - - const authInfoBlock = await page.locator('.auth-box') - const authInfoBlockPo = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('position')) - const authInfoBlockP = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const authInfoBlockB = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('bottom')) - const authInfoBlockW = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const authInfoBlockH = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const authInfoBlockBGC = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const authInfoBlockC = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const authInfoBlockFS = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const authInfoBlockLH = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const authInfoBlockTA = await authInfoBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('text-align')) - expect(authInfoBlockPo).toStrictEqual('absolute') - expect(authInfoBlockP).toStrictEqual('12px 8px') - expect(authInfoBlockB).toStrictEqual('0px') - expect(authInfoBlockW).toStrictEqual('100%') - expect(authInfoBlockH).toStrictEqual('68px') - expect(authInfoBlockBGC).toStrictEqual('rgb(255, 255, 255)') - expect(authInfoBlockC).toStrictEqual('rgb(153, 153, 153)') - expect(authInfoBlockFS).toStrictEqual('12px') - expect(authInfoBlockLH).toStrictEqual('20px') - expect(authInfoBlockTA).toStrictEqual('center') - - const modalActiveInfo = await page.locator('.auth-modal-header .auth-info-modal ol') - const modalActiveInfoC = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const modalActiveInfoFS = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const modalActiveInfoFW = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - const modalActiveInfoLH = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const modalActiveInfoLST = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('list-style-type')) - const modalActiveInfoMB = await modalActiveInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(modalActiveInfoC).toStrictEqual('rgb(102, 102, 102)') - expect(modalActiveInfoFS).toStrictEqual('14px') - expect(modalActiveInfoFW).toStrictEqual('500') - expect(modalActiveInfoLH).toStrictEqual('26px') - expect(modalActiveInfoLST).toStrictEqual('none') - expect(modalActiveInfoMB).toStrictEqual('12px') - await page.getByText('更新授权').click() - await page.getByRole('heading', { name: '更新授权' }).click() - }) - it('更新授权,检查授权信息页', async () => { - const activationBlock = await page.locator('.activation-block') - const activationBlockW = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const activationBlockBGC = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const activationBlockMT = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - const activationBlockP = await activationBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(activationBlockW).toStrictEqual('760px') - expect(activationBlockBGC).toStrictEqual('rgb(248, 248, 250)') - expect(activationBlockMT).toStrictEqual('10vh') - expect(activationBlockP).toStrictEqual('54px 0px') - - const title = await page.getByRole('heading', { name: '更新授权' }) - const titleFrontSize = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const titleFrontWeight = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - const titleFrontTA = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('text-align')) - expect(titleFrontSize).toStrictEqual('24px') - expect(titleFrontWeight).toStrictEqual('700') - expect(titleFrontTA).toStrictEqual('center') - - const activationContent = await page.locator('.activation-content') - const activationContentM = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const activationContentC = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const activationContentFS = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const activationContentFW = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - const activationContentLH = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const activationContentLST = await activationContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('list-style-type')) - expect(activationContentM).toStrictEqual('40px auto 0px auto') - expect(activationContentC).toStrictEqual('rgb(51, 51, 51)') - expect(activationContentFS).toStrictEqual('14px') - expect(activationContentFW).toStrictEqual('500') - expect(activationContentLH).toStrictEqual('26px') - expect(activationContentLST).toStrictEqual('none') - - const listContent = await page.locator('.list-content') - const listContentML = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(listContentML).toStrictEqual('28px') - - const activationButtonDisabled = await (await page.getByRole('button', { name: '更新授权' })).evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - expect(activationButtonDisabled).toStrictEqual('true') - - await page.getByRole('button', { name: '复制' }).click() - await page.getByText('复制成功').click() - await page.setInputFiles('button:has-text("上传证书")', './test/apinto-2027.cert') - await page.getByRole('button', { name: '更新授权' }).click() - - await page.getByRole('heading', { name: '标准版授权' }).click() - - const activationInfo = await page.locator('.activation-info') - const activationInfoC = await activationInfo.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(activationInfoC).toStrictEqual('rgb(102, 102, 102)') - - const goToLogin = await page.locator('.auth-a') - const goToLoginM = await goToLogin.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const goToLoginTL = await goToLogin.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('text-align')) - expect(goToLoginM).toStrictEqual('rgb(24px auto 0px auto)') - expect(goToLoginTL).toStrictEqual('center') - await page.getByText('更新授权').click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/basic-layout/basic-layout.component.spec.ts b/frontend/projects/core/src/app/layout/basic-layout/basic-layout.component.spec.ts deleted file mode 100644 index 152de8108..000000000 --- a/frontend/projects/core/src/app/layout/basic-layout/basic-layout.component.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-07-30 00:40:51 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-03 23:20:22 - * @FilePath: /apinto/src/app/layout/basic-layout/basic-layout.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { BasicLayoutComponent } from './basic-layout.component' -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' - -describe('BasicLayoutComponent test', () => { - let component: BasicLayoutComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - ], - declarations: [ - ], - providers: [ - ] - }).compileComponents() - - fixture = TestBed.createComponent(BasicLayoutComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - // }) - // describe('menulist initial', () => { - // let component: BasicLayoutComponent - // let fixture: ComponentFixture - - // beforeEach(async () => { - // fixture = TestBed.createComponent(BasicLayoutComponent) - // component = fixture.componentInstance - // fixture.detectChanges() - // }) - - it('should initial menuList and every submenu has open attribute', fakeAsync(() => { - // const exp:any[] = [ - // { - // title: '基础设施管理', - // routerLink: 'deploy/cluster', - // matchRouter: true, - // matchRouterExact: true, - // children: [ - // { - // title: '集群管理', - // routerLink: 'deploy/cluster', - // menuIndex: 0, - // level: 1, - // matchRouter: true, - // matchRouterExact: false - // }, - // { - // title: '环境变量', - // routerLink: 'deploy/environment', - // menuIndex: 0, - // level: 1, - // matchRouter: true, - // matchRouterExact: false - // } - // ], - // open: true, - // openChange: undefined - // }] - // expect(component.openMap).toStrictEqual({ 上游服务: false, 基础设施管理: true }) - // expect(component.sideMenuOptions[1].children).toStrictEqual(exp[0].children) - })) - - // it('shouldnt initial menuList when params is []', fakeAsync(() => { - // component.getInitMenuList([]) - // fixture.detectChanges() - // tick(150) - // expect(component.openMap).toStrictEqual({}) - // expect(component.sideMenuOptions).toStrictEqual([]) - // })) - - // it('openMap should be change when subtitle open status is open: openHandler is called', fakeAsync(() => { - // component.openMap = { test1: true, test2: false } - // expect(component.openMap).toStrictEqual({ test1: true, test2: false }) - // component.openHandler('test2') - // fixture.detectChanges() - // expect(component.openMap).toStrictEqual({ test1: false, test2: true }) - // })) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/cert/cert.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/cert/cert.component.spec.ts deleted file mode 100644 index 54e3ef50d..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/cert/cert.component.spec.ts +++ /dev/null @@ -1,317 +0,0 @@ -/* eslint-disable dot-notation */ -import { DeployClusterCertComponent } from './cert.component' -import { - ComponentFixture, - fakeAsync, - flush, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { DeployClusterEnvironmentComponent } from '../environment/environment.component' -import { DeployClusterNodesComponent } from '../nodes/nodes.component' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { - EoNgFeedbackDrawerService, - EoNgFeedbackModalService, - EoNgFeedbackMessageService -} from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { Observable, of } from 'rxjs' -import { ReactiveFormsModule } from '@angular/forms' -import { EoNgButtonModule } from 'eo-ng-button' - -class MockDrawerService { - result: boolean = false - - nzAfterClose = new Subject() - - create () { - return { - afterClose: new Observable(), - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('DeployClusterCertComponent test', () => { - let component: DeployClusterCertComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - ReactiveFormsModule, - EoNgButtonModule, - RouterModule.forRoot([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'cert', - component: DeployClusterCertComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ]) - ], - declarations: [], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { - provide: EoNgFeedbackModalService, - useClass: MockEnsureService - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterCertComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spySubscription = jest.spyOn(component.subscription, 'unsubscribe') - // @ts-ignore - expect(spySubscription).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spySubscription).toHaveBeenCalled() - }) - - it('##getCertsList', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 0, data: { certicates: ['test'] } })) - component.getCertsList() - - expect(spyService).toHaveBeenCalled() - expect(component.certsList).not.toStrictEqual([]) - - const spyService2 = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 2, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - - component.getCertsList() - - expect(spyService2).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##click table btns', () => { - const spyOpendrawer = jest.spyOn(component, 'openDrawer') - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyOpendrawer).toHaveBeenCalledTimes(0) - expect(spyModal).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.certsTableBody[4].btns[0].click(item) - expect(spyOpendrawer).toHaveBeenCalledTimes(1) - component.certsTableBody[4].btns[1].click(item) - expect(spyModal).toHaveBeenCalledTimes(1) - }) - - it('openDrawer', fakeAsync(() => { - component.openDrawer('test') - - expect(component.drawerRef).toBeUndefined() - component.openDrawer('addCert') - fixture.detectChanges() - flush() - expect(component.drawerRef).not.toBeUndefined() - - component.drawerRef = undefined - component.openDrawer('editCert', { id: 0 }) - fixture.detectChanges() - flush() - expect(component.drawerRef).not.toBeUndefined() - })) - - it('##save test', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: 0, data: { certicates: ['test'] } })) - const spyService2 = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: 0, data: { certicates: ['test'] } })) - const spyFn = jest.spyOn(component, 'getCertsList') - - component.save('test') - - expect(spyFn).not.toHaveBeenCalled() - expect(spyService).not.toHaveBeenCalled() - - component.save('addCert') - expect(spyService).not.toHaveBeenCalled() - expect(spyFn).not.toHaveBeenCalled() - - component.save('editCert') - expect(spyService2).not.toHaveBeenCalled() - expect(spyFn).not.toHaveBeenCalled() - - component.validateForm.controls['key'].setValue('key') - component.validateForm.controls['pem'].setValue('pem') - component.save('addCert') - expect(spyService).toHaveBeenCalled() - expect(spyFn).toHaveBeenCalledTimes(1) - - component.save('editCert') - expect(spyService2).toHaveBeenCalled() - expect(spyFn).toHaveBeenCalledTimes(2) - }) - - it('save with fail request', () => { - component.clusterName = 'test' - component.validateForm.controls['key'].setValue('key') - component.validateForm.controls['pem'].setValue('pem') - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: 1, data: { certicates: ['test'] } })) - const spyService3 = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: 1, data: { certicates: ['test'] } })) - expect(spyService).not.toHaveBeenCalled() - expect(spyService3).not.toHaveBeenCalled() - - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - component.save('addCert') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalledWith('添加证书失败!') - - component.save('editCert') - expect(spyService3).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledTimes(2) - }) - - it('##deleteCert with success request', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: 0, data: {} })) - const spyGetCertList = jest.spyOn(component, 'getCertsList') - - expect(spyGetCertList).not.toHaveBeenCalled() - // @ts-ignore - component.deleteCert({ row: {} }) - expect(spyService).toHaveBeenCalled() - expect(spyService).toHaveBeenCalledWith('cluster//certificate/') - - component.clusterName = 'gd_pro' - - component.deleteCert({ - id: 0, - name: '', - operator: '', - updateTime: '', - validTime: '', - createTime: '' - }) - expect(spyService).toBeCalledTimes(2) - expect(spyGetCertList).toHaveBeenCalled() - }) - - it('deleteCert with fail request', () => { - component.clusterName = 'gd_pro' - - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: -1, data: {} })) - const isdelete = httpCommonService.delete('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - - expect(spyMessage).not.toHaveBeenCalled() - component.deleteCert({ - id: 0, - name: '', - operator: '', - updateTime: '', - validTime: '', - createTime: '' - }) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(isdelete).toBe(true) - }) - - it('##encode', fakeAsync(() => { - expect(component.encode('test')).toStrictEqual( - Buffer.from('test').toString('base64') - ) - expect(component.encode('AAA')).not.toStrictEqual('AAA') - })) - - it('##disabledEdit', fakeAsync(() => { - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - component.disabledEdit(false) - expect(component.nzDisabled).toStrictEqual(false) - })) - - it('##certTableClick', () => { - const spyOpendrawer = jest.spyOn(component, 'openDrawer') - expect(spyOpendrawer).not.toHaveBeenCalled() - - component.certTableClick({ data: 'test' }) - expect(spyOpendrawer).toHaveBeenCalledTimes(1) - expect(spyOpendrawer).toHaveBeenCalledWith('editCert', 'test') - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/cluster.component.test.ts b/frontend/projects/core/src/app/layout/deploy/cluster/cluster.component.test.ts deleted file mode 100644 index 12a3ce8e2..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/cluster.component.test.ts +++ /dev/null @@ -1,1190 +0,0 @@ -describe('网关集群 e2e test', () => { - it('初始化页面,点击基础设施-网关集群菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByText('基础设施').click() - await page.getByRole('link', { name: '网关集群' }).click() - }) - it('检查页面样式', async () => { - // 布局 - const listHeader = await page.locator('.list-header') - const listHeaderMT = await listHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(listHeaderMT).toStrictEqual('12px') - - // 新建集群的按钮样式 - const createBtn = await page.getByRole('button', { name: '新建集群' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - }) - it('点击新建集群,检查页面样式,输入集群地址,点击测试,出现表格,检查样式', async () => { - await page.getByRole('button', { name: '新建集群' }).click() - - // 集群名称输入框样式 - const nameInput = await page.getByPlaceholder('英文数字下划线组合,首字母必须为英文') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 环境输入框样式 - const envInput = await page.locator('eo-ng-select') - const envInputW = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const envInputH = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(envInputW).toStrictEqual('346px') - await expect(envInputH).toStrictEqual('32px') - - // 描述输入框样式 - const descInput = await page.locator('textarea') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 集群地址输入框样式 - const addrInput = await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入') - const addrInputW = await addrInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const addrInputH = await addrInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(addrInputW).toStrictEqual('346px') - await expect(addrInputH).toStrictEqual('32px') - - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').fill('http://172.17.0.1:9400') - await page.getByRole('button', { name: '测试' }).click() - }) - it('点击保存;逐一填入必填项,点击保存,修改集群地址,点击保存,只有通过测试的集群地址才可保存,如出现消息弹窗且未保存成功,则点击取消,返回列表页', async () => { - await page.getByRole('button', { name: '测试' }).click() - await page.locator('nz-form-control').filter({ hasText: '测试 必填项' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试 必填项' }).getByPlaceholder('请输入').fill('http://172.0.0.1:9400') - await page.getByRole('button', { name: '测试' }).click() - await page.getByText('node addr http://172.0.0.1:9400 can not be connected').click() - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').fill('http://172.17.0.1') - await page.locator('nz-form-control').filter({ hasText: '测试 集群地址输入错误,请重新输入' }).getByPlaceholder('请输入').fill('http://172.17.0.1:9400') - await page.getByRole('button', { name: '测试' }).click() - await page.getByRole('columnheader', { name: '名称' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('英文数字下划线组合,首字母必须为英文').click() - await page.getByPlaceholder('英文数字下划线组合,首字母必须为英文').fill('TESTA') - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试' }).getByPlaceholder('请输入').fill('http://172.17.0.1:940') - await page.getByText('集群地址需要通过测试').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-form-control').filter({ hasText: '测试 集群地址需要通过测试' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试 集群地址需要通过测试' }).getByPlaceholder('请输入').fill('http://172.17.0.1') - await page.getByText('集群地址输入错误,请重新输入').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-form-control').filter({ hasText: '测试 集群地址输入错误,请重新输入' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '测试 集群地址输入错误,请重新输入' }).getByPlaceholder('请输入').fill('http://172.17.0.1:9400') - await page.getByRole('button', { name: '保存' }).click() - if (await page.getByText('集群已有这个节点信息') && await page.getByText('集群已有这个节点信息').isVisible()) { - await page.getByRole('button', { name: '取消' }).click() - await page.getByText('状态').click() - } - await page.getByText('状态').click() - }) - it('点击某一个集群,进入信息详情页,当前处于环境变量tab页,检查样式', async () => { - await page.locator('eo-ng-apinto-table tr').last().locator('td').first().click() - const envTab = await page.getByRole('tab', { name: '环境变量' }).getByRole('link', { name: '环境变量' }) - const envTabC = await envTab.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(envTabC).toStrictEqual('rgb(34, 84, 157)') - - const certTab = await page.getByRole('tab', { name: '证书管理' }) - const certTabC = await certTab.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(certTabC).toStrictEqual('rgb(0, 0, 0)') - - const nodeTab = await page.getByRole('tab', { name: '网关节点' }) - const nodeTabC = await nodeTab.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(nodeTabC).toStrictEqual('rgb(0, 0, 0)') - - const confTab = await page.getByRole('tab', { name: '配置管理' }) - const confTabC = await confTab.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(confTabC).toStrictEqual('rgb(0, 0, 0)') - - const createEnvBtn = await page.getByRole('button', { name: '新建配置' }) - const createEnvBtnM = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const createEnvBtnP = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const createEnvBtnBC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createEnvBtnBGC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createEnvBtnC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(createEnvBtnM).toStrictEqual('0px 0px 0px 12px') - expect(createEnvBtnP).toStrictEqual('0px 12px') - expect(createEnvBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createEnvBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(createEnvBtnC).toStrictEqual('rgb(255, 255, 255)') - - const publishEnvBtn = await page.getByRole('button', { name: '发布' }) - const publishEnvBtnM = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const publishEnvBtnP = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const publishEnvBtnBC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const publishEnvBtnBGC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const publishEnvBtnC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(publishEnvBtnM).toStrictEqual('0px 0px 0px 12px') - expect(publishEnvBtnP).toStrictEqual('0px 12px') - expect(publishEnvBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(publishEnvBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(publishEnvBtnC).toStrictEqual('rgb(255, 255, 255)') - - const updateEnvBtn = await page.getByRole('button', { name: '同步配置' }) - const updateEnvBtnM = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const updateEnvBtnP = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const updateEnvBtnBC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const updateEnvBtnBGC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const updateEnvBtnC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(updateEnvBtnM).toStrictEqual('0px 0px 0px 12px') - expect(updateEnvBtnP).toStrictEqual('0px 12px') - expect(updateEnvBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(updateEnvBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(updateEnvBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const updateHistoryBtn = await page.getByRole('button', { name: '更改历史' }) - const updateHistoryBtnM = await updateHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const updateHistoryBtnP = await updateHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const updateHistoryBtnBC = await updateHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const updateHistoryBtnBGC = await updateHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const updateHistoryBtnC = await updateHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(updateHistoryBtnM).toStrictEqual('0px') - expect(updateHistoryBtnP).toStrictEqual('0px 12px') - expect(updateHistoryBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(updateHistoryBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(updateHistoryBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const publishHistoryBtn = await page.getByRole('button', { name: '发布历史' }) - const publishHistoryBtnM = await publishHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const publishHistoryBtnP = await publishHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const publishHistoryBtnBC = await publishHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const publishHistoryBtnBGC = await publishHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const publishHistoryBtnC = await publishHistoryBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(publishHistoryBtnM).toStrictEqual('0px 24px 0px 12px') - expect(publishHistoryBtnP).toStrictEqual('0px 12px') - expect(publishHistoryBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(publishHistoryBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(publishHistoryBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - }) - it('点击新建配置,检查样式,逐一填入必填项直至保存成功;点击新建配置,点击取消', async () => { - // key输入框样式 - const nameInput = await page.getByPlaceholder('英文、下划线及圆点组合') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const nameInputD = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - await expect(nameInputD).toStrictEqual('false') - - // value输入框样式 - const envInput = await page.locator('.ant-drawer-body textarea') - const envInputW = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const envInputH = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const envInputD = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(envInputW).toStrictEqual('346px') - await expect(envInputH).toStrictEqual('68px') - await expect(envInputD).toStrictEqual('false') - - // 描述输入框样式 - const descInput = await page.locator('textarea') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const descInputD = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - await expect(descInputD).toStrictEqual('false') - - const publishEnvBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '保存' }) - const publishEnvBtnM = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const publishEnvBtnP = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const publishEnvBtnBC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const publishEnvBtnBGC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const publishEnvBtnC = await publishEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(publishEnvBtnM).toStrictEqual('0px') - expect(publishEnvBtnP).toStrictEqual('0px') - expect(publishEnvBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(publishEnvBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(publishEnvBtnC).toStrictEqual('rgb(255, 255, 255)') - - const updateEnvBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '取消' }) - const updateEnvBtnM = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const updateEnvBtnP = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const updateEnvBtnBC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const updateEnvBtnBGC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const updateEnvBtnC = await updateEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(updateEnvBtnM).toStrictEqual('0px 0px 0px 12px') - expect(updateEnvBtnP).toStrictEqual('0px 12px') - expect(updateEnvBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(updateEnvBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(updateEnvBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').fill(' test ') - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').press('Enter') - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').fill(' test \n123 rfgasd') - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('检测隐藏字符').click() - await page.getByText('#空格##空格##空格#test#空格##空格##换行符#123#空格##空格#rfgasd').click() - const detectTip = await page.getByText('#空格##空格##空格#test#空格##空格##换行符#123#空格##空格#rfgasd') - const detectTipBGC = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const detectTipC = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const detectTipFS = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const detectTipLH = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const detectTipM = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const detectTipP = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const detectTipW = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const detectTipWB = await detectTip.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('word-break')) - - expect(detectTipBGC).toStrictEqual('rgb(248, 248, 250)') - expect(detectTipC).toStrictEqual('rgb(153, 153, 153)') - expect(detectTipFS).toStrictEqual('12px') - expect(detectTipLH).toStrictEqual('20px') - expect(detectTipM).toStrictEqual('0px') - expect(detectTipP).toStrictEqual('0px 0px 0px 12px') - expect(detectTipW).toStrictEqual('346px') - expect(detectTipWB).toStrictEqual('break-all') - - const detectedText = await page.locator('.detected-symbol').first() - const detectedTextC = await detectedText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(detectedTextC).toStrictEqual('rgb(248, 248, 250)') - - await page.getByPlaceholder('英文、下划线及圆点组合').click() - await page.getByPlaceholder('英文、下划线及圆点组合').fill('testForeee') - await page.locator('nz-form-item').filter({ hasText: '描述' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-item').filter({ hasText: '描述' }).getByPlaceholder('请输入').fill('desc') - await page.getByRole('button', { name: '保存' }).click() - }) - it('点击列表中某一个环境变量,检查KEY与描述为不可修改,修改value并提交', async () => { - await page.getByRole('cell', { name: 'testForeee' }).click() - // key输入框样式 - const nameInput = await page.getByPlaceholder('英文、下划线及圆点组合') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const nameInputD = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - await expect(nameInputD).toStrictEqual('true') - - // value输入框样式 - const envInput = await page.locator('.ant-drawer-body textarea') - const envInputW = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const envInputH = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const envInputD = await envInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(envInputW).toStrictEqual('346px') - await expect(envInputH).toStrictEqual('68px') - await expect(envInputD).toStrictEqual('false') - - // 描述输入框样式 - const descInput = await page.locator('textarea') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const descInputD = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - await expect(descInputD).toStrictEqual('true') - - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').click() - await page.locator('nz-form-control').filter({ hasText: '注意:隐藏字符(空格、换行符、制表符Tab)容易导致配置出错,如果需要检测Value中隐藏字符,请点击检测隐藏字符' }).getByPlaceholder('请输入').fill('test \n123 rfgasd 1') - await page.getByRole('button', { name: '提交' }).click() - }) - it('点击列表中某个环境变量的编辑icon,点击取消返回列表页;点击删除,该行value被清空,发布状态变为缺失', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button >> nth = 0').click() - await page.getByRole('button', { name: '取消' }).click() - if (await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button >> nth = 1') && await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button >> nth = 1').isVisible()) { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button >> nth = 1').click() - await page.getByRole('button', { name: '取消' }).click() - expect(page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 3').innerText()).not.toStrictEqual('缺失') - - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button >> nth = 1').click() - await page.getByText('该数据删除后将无法找回,请确认是否删除?').click() - await page.getByRole('button', { name: '确定' }).click() - } - expect(page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').innerText()).toStrictEqual('') - expect(page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 3').innerText()).toStrictEqual('缺失') - }) - it('点击发布,检查样式;删除必填项则不可提交,填入必填项后,如表格下方有红色信息,也不可提交,点击取消返回页面', async () => { - await page.getByRole('button', { name: '发布' }).first().click() - // key输入框样式 - const nameInput = await page.locator('input') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 描述输入框样式 - const descInput = await page.locator('input') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 布局 - const formItem0 = await page.locator('.ant-drawer-body .ant-form-item-control-input-content >> nth = 0') - const formItem0PL = await formItem0.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const formItem1 = await page.locator('.ant-drawer-body .ant-form-item-control-input-content >> nth = 1') - const formItem1PL = await formItem1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const formItem2 = await page.locator('.ant-drawer-body .ant-form-item-control-input-content >> nth = 2') - const formItem2PL = await formItem2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const formItem3 = await page.locator('.ant-drawer-body .ant-form-item-control-input-content >> nth = 3') - const formItem3PL = await formItem3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const formItem4 = await page.locator('.ant-drawer-body .ant-form-item-control-input-content >> nth = 4') - const formItem4PL = await formItem4.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - - // 按钮 - const submitBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '保存' }) - const submitBtnM = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const submitBtnP = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const submitBtnBC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const submitBtnBGC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const submitBtnC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(submitBtnM).toStrictEqual('0px') - expect(submitBtnP).toStrictEqual('0px') - expect(submitBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnC).toStrictEqual('rgb(255, 255, 255)') - - const cancleBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '取消' }) - const cancleBtnM = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const cancleBtnP = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const cancleBtnBC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancleBtnBGC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(cancleBtnM).toStrictEqual('0px 0px 0px 12px') - expect(cancleBtnP).toStrictEqual('0px 12px') - expect(cancleBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(cancleBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(cancleBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - expect(formItem0PL).toStrictEqual('12px') - expect(formItem1PL).toStrictEqual('12px') - expect(formItem2PL).toStrictEqual('12px') - expect(formItem3PL).toStrictEqual('12px') - expect(formItem4PL).toStrictEqual('12px') - - await page.locator('input').click() - await page.locator('input').fill('') - await page.getByText('必填项').click() - await page.getByRole('button', { name: '提交' }).click() - await page.locator('input').click() - await page.locator('input').fill('test') - if (await page.locator('.ant-drawer-body .ant-form-item-explain-error') && await page.locator('.ant-drawer-body .ant-form-item-explain-error').isVisible()) { - await page.getByRole('button', { name: '提交' }).click() - await page.getByRole('button', { name: '取消' }).click() - } else { - await page.getByRole('button', { name: '提交' }).click() - } - }) - it('点击同步配置,检查样式和操作', async () => { - await page.getByRole('button', { name: '同步配置' }).click() - - const nameInput = await page.locator('input.ant-input') - const nameInputD = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const nameInputP = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const nameInputM = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - - expect(nameInputD).toStrictEqual('true') - expect(nameInputW).toStrictEqual('346px') - expect(nameInputH).toStrictEqual('32px') - expect(nameInputP).toStrictEqual('4px 11px') - expect(nameInputM).toStrictEqual('0px 0px 0px 12px') - - const listContent1 = await page.locator('.ant-drawer-body .list-content').first() - const listContent1P = await listContent1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const listContent1W = await listContent1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(listContent1P).toStrictEqual('0px 0px 20px 0px') - expect(listContent1W).toStrictEqual('568px') - - const listContent2 = await page.locator('.ant-drawer-body .list-content').last() - const listContent2P = await listContent2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const listContent2W = await listContent2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(listContent2P).toStrictEqual('0px 0px 20px 0px') - expect(listContent2W).toStrictEqual('568px') - - // 按钮 - const submitBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '保存' }) - const submitBtnM = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const submitBtnP = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const submitBtnBC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const submitBtnBGC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const submitBtnC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(submitBtnM).toStrictEqual('0px') - expect(submitBtnP).toStrictEqual('0px') - expect(submitBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnC).toStrictEqual('rgb(255, 255, 255)') - - const cancleBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '取消' }) - const cancleBtnM = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const cancleBtnP = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const cancleBtnBC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancleBtnBGC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(cancleBtnM).toStrictEqual('0px 0px 0px 12px') - expect(cancleBtnP).toStrictEqual('0px 12px') - expect(cancleBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(cancleBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(cancleBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - await page.getByRole('row', { name: '集群名称 所在环境' }).getByLabel('').check() - await page.getByRole('button', { name: '提交' }).click() - await page.getByRole('row', { name: 'KEY VALUE 更新时间' }).getByLabel('').check() - await page.getByRole('button', { name: '取消' }).click() - await page.getByRole('button', { name: '同步配置' }).click() - await page.getByRole('row', { name: '集群名称 所在环境' }).getByRole('columnheader').first().click() - await page.getByRole('row', { name: 'KEY VALUE 更新时间' }).getByLabel('').check() - await page.getByRole('button', { name: '提交' }).click() - await page.getByText('success').click() - }) - it('点击更改历史,检查样式和操作', async () => { - await page.getByRole('button', { name: '更改历史' }).click() - - const listContent = await page.locator('.ant-drawer-body .list-content').first() - const listContentP = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const listContentW = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(listContentP).toStrictEqual('0px 0px 0px 0px') - expect(listContentW).toStrictEqual('568px') - await page.getByRole('button', { name: 'Close' }).click() - }) - it('点击发布历史,检查样式和操作', async () => { - await page.getByRole('button', { name: '发布历史' }).click() - - const listContent = await page.locator('.ant-drawer-body .list-content').first() - const listContentP = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const listContentW = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(listContentP).toStrictEqual('0px 0px 0px 0px') - expect(listContentW).toStrictEqual('568px') - await page.getByRole('button', { name: 'Close' }).click() - await page.locator('eo-ng-select-top-control').click() - await page.getByText('20 条/页').click() - await page.locator('.ant-drawer-body .ant-table-row-expand-icon').first().click() - await page.locator('.ant-drawer-body .ant-table-row-expand-icon.ant-table-row-expand-icon-expanded').first().click() - await page.getByRole('button', { name: 'Close' }).click() - }) - it('从面包屑进入集群列表,点击表格进入环境变量列表,切换至证书管理tab;检查证书列表的样式', async () => { - await page.locator('nz-breadcrumb').getByRole('link', { name: '网关集群' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').first().click() - await page.getByRole('link', { name: '证书管理' }).click() - - const createEnvBtn = await page.getByRole('button', { name: '新建证书' }) - const createEnvBtnM = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const createEnvBtnP = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const createEnvBtnBC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createEnvBtnBGC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createEnvBtnC = await createEnvBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(createEnvBtnM).toStrictEqual('0px 0px 0px 12px') - expect(createEnvBtnP).toStrictEqual('0px 12px') - expect(createEnvBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createEnvBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(createEnvBtnC).toStrictEqual('rgb(255, 255, 255)') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - }) - it('点击新建证书,检查样式和操作,保存;再次点击新建证书,点击取消', async () => { - await page.getByRole('button', { name: '新建证书' }).click() - - // 上传密钥按钮 - const uploadKeyBtn = await page.locator('.ant-drawer-body label.ant-btn').first() - const uploadKeyBtnM = await uploadKeyBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const uploadKeyBtnP = await uploadKeyBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const uploadKeyBtnBC = await uploadKeyBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const uploadKeyBtnBGC = await uploadKeyBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const uploadKeyBtnC = await uploadKeyBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(uploadKeyBtnM).toStrictEqual('0px') - expect(uploadKeyBtnP).toStrictEqual('7px 12px') - expect(uploadKeyBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(uploadKeyBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(uploadKeyBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const uploadKeyBtnIcon = await page.locator('.ant-drawer-body label.ant-btn').first().locator('iconfont') - const uploadKeyBtnIconFS = await uploadKeyBtnIcon.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(uploadKeyBtnIconFS).toStrictEqual('14px') - - // 上传密钥输入框 - const uploadKeyInput = await page.locator('.ant-drawer-body textarea').first() - const uploadKeyInputW = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const uploadKeyInputH = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const uploadKeyInputBGC = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const uploadKeyInputBC = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const uploadKeyInputC = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const uploadKeyInputM = await uploadKeyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - - await expect(uploadKeyInputW).toStrictEqual('346px') - await expect(uploadKeyInputH).toStrictEqual('68px') - await expect(uploadKeyInputBGC).toStrictEqual('rgb(51, 51, 51)') - await expect(uploadKeyInputBC).toStrictEqual('rgb(215, 215, 215)') - await expect(uploadKeyInputC).toStrictEqual('rgb(187, 187, 187)') - await expect(uploadKeyInputM).toStrictEqual('12px 0px 0px 0px') - - // 上传证书按钮 - const uploadCertBtn = await page.locator('.ant-drawer-body label.ant-btn').last() - const uploadCertBtnM = await uploadCertBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const uploadCertBtnP = await uploadCertBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const uploadCertBtnBC = await uploadCertBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const uploadCertBtnBGC = await uploadCertBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const uploadCertBtnC = await uploadCertBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(uploadCertBtnM).toStrictEqual('0px') - expect(uploadCertBtnP).toStrictEqual('7px 12px') - expect(uploadCertBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(uploadCertBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(uploadCertBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const uploadCertBtnIcon = await page.locator('.ant-drawer-body label.ant-btn').last().locator('iconfont') - const uploadCertBtnIconFS = await uploadCertBtnIcon.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(uploadCertBtnIconFS).toStrictEqual('14px') - // 上传证书输入框 - const uploadCertInput = await page.locator('.ant-drawer-body textarea').first() - const uploadCertInputW = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const uploadCertInputH = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const uploadCertInputBGC = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const uploadCertInputBC = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const uploadCertInputC = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const uploadCertInputM = await uploadCertInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - - await expect(uploadCertInputW).toStrictEqual('346px') - await expect(uploadCertInputH).toStrictEqual('68px') - await expect(uploadCertInputBGC).toStrictEqual('rgb(51, 51, 51)') - await expect(uploadCertInputBC).toStrictEqual('rgb(215, 215, 215)') - await expect(uploadCertInputC).toStrictEqual('rgb(187, 187, 187)') - await expect(uploadCertInputM).toStrictEqual('12px 0px 0px 0px') - - // 保存、取消按钮 - - const submitBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '保存' }) - const submitBtnM = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const submitBtnP = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const submitBtnBC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const submitBtnBGC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const submitBtnC = await submitBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(submitBtnM).toStrictEqual('0px') - expect(submitBtnP).toStrictEqual('0px 12px') - expect(submitBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(submitBtnC).toStrictEqual('rgb(255, 255, 255)') - - const cancleBtn = await page.locator('.ant-drawer-body').getByRole('button', { name: '取消' }) - const cancleBtnM = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const cancleBtnP = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const cancleBtnBC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancleBtnBGC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(cancleBtnM).toStrictEqual('0px 0px 0px 12px') - expect(cancleBtnP).toStrictEqual('0px 12px') - expect(cancleBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(cancleBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(cancleBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('密钥文件的后缀名一般为.key的文件内容').click() - await page.getByPlaceholder('密钥文件的后缀名一般为.key的文件内容').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('上传证书').click() - await page.setInputFiles('label:has-text("上传证书") input', './test/apinto-2027.cert') - await page.getByPlaceholder('证书文件的后缀名一般为.crt或.pem的文件内容').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-message') - await page.getByRole('button', { name: '取消' }).click() - }) - it('检查面包屑,从面包屑进入集群列表,再次点击表格进入环境变量列表,测试tab,切换至网关节点tab', async () => { - await page.locator('nz-breadcrumb').getByRole('link', { name: '网关集群' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1') - await page.getByRole('link', { name: '证书管理' }).click() - await page.getByRole('link', { name: '网关节点' }).click() - await page.getByRole('link', { name: '配置管理' }).click() - await page.getByRole('link', { name: '网关节点' }).click() - await page.getByRole('link', { name: '证书管理' }).click() - await page.getByRole('tab', { name: '环境变量' }).getByRole('link', { name: '环境变量' }).click() - await page.getByText('环境变量证书管理网关节点配置管理').click() - await page.getByRole('link', { name: '网关节点' }).click() - await page.getByRole('link', { name: '配置管理' }).click() - await page.getByRole('link', { name: '证书管理' }).click() - await page.getByRole('tab', { name: '环境变量' }).getByRole('link', { name: '环境变量' }).click() - await page.getByRole('link', { name: '网关节点' }).click() - await page.getByRole('link', { name: '配置管理' }).click() - await page.getByRole('tab', { name: '环境变量' }).getByRole('link', { name: '环境变量' }).click() - await page.getByRole('link', { name: '配置管理' }).click() - await page.getByRole('link', { name: '证书管理' }).click() - await page.getByRole('link', { name: '网关节点' }).click() - }) - it('检查网关节点列表的样式,并测试重置配置', async () => { - const updateBtn = await page.getByRole('button', { name: '新建配置' }) - - const updateBtnD = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - const updateBtnM = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const updateBtnP = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const updateBtnBC = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const updateBtnBGC = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const updateBtnC = await updateBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(updateBtnM).toStrictEqual('0px 0px 0px 12px') - expect(updateBtnP).toStrictEqual('0px 12px') - - if (updateBtnD !== 'true') { - expect(updateBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(updateBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(updateBtnC).toStrictEqual('rgb(255, 255, 255)') - await updateBtn.click() - } else { - expect(updateBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(updateBtnBGC).toStrictEqual('rgb(245, 245, 245)') - expect(updateBtnC).toStrictEqual('rgba(0, 0, 0, 0.25)') - } - - const resetBtn = await page.getByRole('button', { name: '同步配置' }) - const resetBtnM = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const resetBtnP = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const resetBtnBC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const resetBtnBGC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const resetBtnC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(resetBtnM).toStrictEqual('0px 0px 0px 12px') - expect(resetBtnP).toStrictEqual('0px 12px') - expect(resetBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(resetBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(resetBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - await page.getByRole('button', { name: '重置配置' }).click() - await page.locator('.ant-drawer-header').getByText('重置配置').click() - await page.locator('nz-form-control div').nth(1).click() - const formControlDiv = page.locator('nz-form-control div').nth(1) - const formControlDivM = await formControlDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const formControlDivP = await formControlDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(formControlDivM).toStrictEqual('0px') - expect(formControlDivP).toStrictEqual('0px 0px 0px 12px') - - await page.getByRole('button', { name: '测试' }).click() - await page.getByText('必填项').click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http:11') - await page.getByRole('button', { name: '测试' }).click() - await page.getByText('集群地址输入错误,请重新输入').click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http://172.17.0.1:9') - await page.getByRole('button', { name: '测试' }).click() - await page.getByText('集群地址需要通过测试').click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http://172.17.0.1:9400') - await page.getByRole('button', { name: '测试' }).click() - await page.locator('#cdk-drop-list-1').getByRole('columnheader', { name: '名称' }).click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http://172.17.0.1:94') - await page.getByRole('button', { name: '测试' }).click() - await page.getByPlaceholder('请输入').click() - await page.getByRole('button', { name: '提交' }).click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http://172.17.0.1:940') - await page.getByRole('button', { name: '提交' }).click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('http://172.17.0.1:9400') - await page.getByRole('button', { name: '提交' }).click() - await page.locator('.ant-message').click() - await page.getByRole('columnheader', { name: '名称' }).click() - }) - it('点击面包屑进入集群列表,点击表格并切换至配置管理tab', async () => { - await page.locator('nz-breadcrumb').getByRole('link', { name: '网关集群' }).click() - await page.getByRole('cell', { name: 'zzytest' }).click() - await page.getByRole('link', { name: '配置管理' }).click() - }) - it('检查redis配置的样式与操作', async () => { - const mgRedis = await page.locator('mg_layout').first() - const mgRedisM = await mgRedis.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const mgRedisP = await mgRedis.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(mgRedisM).toStrictEqual('12px 16px 0px 16px') - expect(mgRedisP).toStrictEqual('0px') - - const redisBox = await page.locator('deploy-cluster-redis-box').first() - const redisBoxM = await redisBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const redisBoxB = await redisBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border')) - let redisBoxBB = await redisBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-bottom')) - expect(redisBoxM).toStrictEqual('0px') - expect(redisBoxB).toStrictEqual('1px solid rgb(232, 232, 232)') - expect(redisBoxBB).toStrictEqual('none') - - const redisBoxArrowE = await redisBox.locator('.title-box span.icon-zhankai').first() - redisBoxArrowE.click() - - redisBoxBB = await redisBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-bottom')) - expect(redisBoxBB).toStrictEqual('1px solid rgb(232, 232, 232)') - - const redisBoxArrowC = await redisBox.locator('.title-box span.icon-shouqi').first() - redisBoxArrowC.click() - - redisBoxBB = await redisBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-bottom')) - expect(redisBoxBB).toStrictEqual('none') - - const listTable = await page.locator('eo-ng-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableTd1 = await page.locator('eo-ng-table tr >> nth = 2 >> th >> nth = 0') - const listTableTd1Padding = await listTableTd1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTd1Padding).toStrictEqual('0px') - - const listTableTd2 = await page.locator('eo-ng-table tr >> nth = 2 >> th >> nth = 1') - const listTableTd2Padding = await listTableTd2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTd2Padding).toStrictEqual('0px') - - const listTableTd3 = await page.locator('eo-ng-table tr >> nth = 2 >> th >> nth = 2') - const listTableTd3Padding = await listTableTd3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTd3Padding).toStrictEqual('0px') - - const listTableTd4 = await page.locator('eo-ng-table tr >> nth = 2 >> th >> nth = 3') - const listTableTd4Padding = await listTableTd4.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTd4Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-table tr >> nth = 1 >> td >> nth = 4') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-table tr >> nth = 1 >> td >> nth = 4 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('0px') - - let iconColor = await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - if (await page.locator('eo-ng-table eo-ng-switch') && await page.locator('eo-ng-table eo-ng-switch').isVisible()) { - expect(iconColor).toStrictEqual('rgb(34, 84, 157)') - - await page.locator('eo-ng-switch').getByRole('button').click() - await page.locator('eo-ng-switch').getByRole('button').click() - } else { - expect(iconColor).toStrictEqual('rgb(187, 187, 187)') - } - - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').click() - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').fill('') - iconColor = await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - expect(iconColor).toStrictEqual('rgb(187, 187, 187)') - - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').click() - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').fill('123123.a2') - iconColor = await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - expect(iconColor).toStrictEqual('rgb(187, 187, 187)') - - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').click() - await page.getByPlaceholder('请输入域名/IP:端口,多个以逗号分隔').fill('111.111.1.1:1') - iconColor = await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - expect(iconColor).toStrictEqual('rgb(34, 84, 157)') - - await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().click() - - await page.getByPlaceholder('请输入用户名').click() - await page.getByPlaceholder('请输入用户名').fill('test') - await page.getByPlaceholder('请输入密码').click() - await page.getByPlaceholder('请输入密码').fill('aaa') - await page.locator('.depoly-cluster-redis-box .eo-ng-table-btns button').first().click() - }) - it('检查集群描述的样式与操作', async () => { - const descBlock = await page.locator('.cluster-desc-block') - const descBlockPadding = await descBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const descBlockBGC = await descBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(descBlockPadding).toStrictEqual('16px') - expect(descBlockBGC).toStrictEqual('rgb(248, 248, 250)') - - await page.locator('.cluster-desc-block .icon-bianji').click() - let descText = await page.locator('.cluster-desc-block span.cluster-desc-text').innerText() - await page.locator('.cluster-desc-block input').click() - await page.locator('.cluster-desc-block input').fill('测试内容') - await page.locator('.cluster-desc-block .icon-guanbi').click() - expect(await page.locator('.cluster-desc-block span.cluster-desc-text').innerText()).toStrictEqual(descText) - await page.locator('.cluster-desc-block input').click() - await page.locator('.cluster-desc-block input').fill('超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容超长测试内容') - await page.locator('.cluster-desc-block .icon-chenggong').click() - expect(await page.locator('.cluster-desc-block span.cluster-desc-text').innerText()).not.toStrictEqual(descText) - - const textH = await page.locator('.cluster-desc-block span.cluster-desc-text').evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - const sectionH = await page.locator('.cluster-desc-block section').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - expect(textH).toStrictEqual('22px') - expect(sectionH).toStrictEqual('22px') - await page.locator('.cluster-desc-block .icon-bianji').click() - - const inputW = await page.locator('.cluster-desc-block input').first().evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(inputW).not.toStrictEqual('346px') - await page.locator('.cluster-desc-block input').click() - await page.locator('.cluster-desc-block input').fill('测试内容') - await page.locator('.cluster-desc-block .icon-chenggong').click() - descText = await page.locator('.cluster-desc-block span.cluster-desc-text').innerText() - expect(descText).not.toStrictEqual('测试内容') - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/content/content.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/content/content.component.spec.ts deleted file mode 100644 index cccc8d06f..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/content/content.component.spec.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { NzTabsModule } from 'ng-zorro-antd/tabs' -import { NzIconTestModule } from 'ng-zorro-antd/icon/testing' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule, Router } from '@angular/router' -import { EoNgFeedbackDrawerService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { DeployClusterContentComponent } from './content.component' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF, CommonModule } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { DeployClusterEnvironmentComponent } from '../environment/environment.component' -import { DeployClusterNodesComponent } from '../nodes/nodes.component' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgTabsModule } from 'eo-ng-tabs' -import { RouterTestingModule } from '@angular/router/testing' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - error () { - return 'error' - } -} - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -describe('DeployClusterContentComponent test', () => { - let component: DeployClusterContentComponent - let fixture: ComponentFixture - let router: Router - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, CommonModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - EoNgTabsModule, NzTabsModule, NzIconTestModule, - RouterTestingModule.withRoutes([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'cert', - component: DeployClusterContentComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ]), - RouterModule.forRoot([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'cert', - component: DeployClusterContentComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ] - ) - ], - declarations: [DeployClusterContentComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterContentComponent) - - component = fixture.componentInstance - fixture.detectChanges() - router = TestBed.inject(Router) - router.initialNavigation() - }) - it('should create', async () => { - expect(component).toBeTruthy() - }) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spySubscription = jest.spyOn(component.subscription, 'unsubscribe') - // @ts-ignore - expect(spySubscription).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spySubscription).toHaveBeenCalled() - }) - - it('##getClustersData successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - cluster: { - env: 'pro', - status: 'NORMAL', - desc: 'password', - name: 'name', - createTime: '2022-01-02', - updateTime: '2022-01-02' - } - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - - component.getClustersData() - fixture.detectChanges() - - expect(component.clusterDesc).toStrictEqual('password') - expect(component._clusterDesc).toStrictEqual('password') - }) - - it('##getClustersData failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - }, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - - component.getClustersData() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##getClustersData failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - component.getClustersData() - fixture.detectChanges() - expect(component.clusterDesc).toStrictEqual('') - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取列表数据失败!') - }) - - it('##save successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue( - of({ - code: 0, - data: {}, - msg: 'success' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - component._clusterDesc = 'test_desc' - component.clusterDesc = '' - component.disabled = false - - component.save() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component.clusterDesc).toStrictEqual('test_desc') - expect(component.disabled).toStrictEqual(true) - }) - - it('##save failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue( - of({ - code: -1, - data: { - }, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - component._clusterDesc = 'test_desc' - component.clusterDesc = '' - component.disabled = false - component.save() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(component.clusterDesc).toStrictEqual('') - expect(spyMessage).toBeCalledWith('faild') - expect(component.disabled).toStrictEqual(true) - }) - - it('##save failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue( - of({ - code: -1, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.clusterName = 'test' - component._clusterDesc = 'test_desc' - component.disabled = false - component.clusterDesc = '' - component.save() - fixture.detectChanges() - - expect(component._clusterDesc).toStrictEqual('') - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(component.disabled).toStrictEqual(true) - expect(spyMessage).toBeCalledWith('修改失败!') - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/create/create.component.spec.ts deleted file mode 100644 index ab0ab618a..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/create/create.component.spec.ts +++ /dev/null @@ -1,474 +0,0 @@ -/* eslint-disable dot-notation */ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { NzTabsModule } from 'ng-zorro-antd/tabs' -import { NzIconTestModule } from 'ng-zorro-antd/icon/testing' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule, Router } from '@angular/router' -import { EoNgFeedbackDrawerService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF, CommonModule } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { DeployClusterEnvironmentComponent } from '../environment/environment.component' -import { DeployClusterNodesComponent } from '../nodes/nodes.component' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgTabsModule } from 'eo-ng-tabs' -import { RouterTestingModule } from '@angular/router/testing' -import { DeployClusterCreateComponent } from './create.component' -import { ReactiveFormsModule } from '@angular/forms' -import { EoNgSelectModule } from 'eo-ng-select' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - error () { - return 'error' - } -} - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -describe('DeployClusterCreateComponent test', () => { - let component: DeployClusterCreateComponent - let fixture: ComponentFixture - let router: Router - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, CommonModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - EoNgTabsModule, NzTabsModule, NzIconTestModule, - ReactiveFormsModule, EoNgSelectModule, - RouterTestingModule.withRoutes([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'cert', - component: DeployClusterCreateComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ]), - RouterModule.forRoot([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'cert', - component: DeployClusterCreateComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ] - ) - ], - declarations: [DeployClusterCreateComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterCreateComponent) - - component = fixture.componentInstance - fixture.detectChanges() - router = TestBed.inject(Router) - router.initialNavigation() - }) - it('should create', async () => { - expect(component).toBeTruthy() - }) - - it('##getEnvList successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - envs: [ - { name: 'PRO', value: 'PRO' }, - { name: 'FAT', value: 'FAT' }, - { name: 'DEV', value: 'DEV' }, - { name: 'UAT', value: 'UAT' } - ] - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getEnvList() - fixture.detectChanges() - expect(component.environmentList).toStrictEqual([ - { label: 'PRO', value: 'PRO' }, - { label: 'FAT', value: 'FAT' }, - { label: 'DEV', value: 'DEV' }, - { label: 'UAT', value: 'UAT' } - ]) - expect(component.validateForm.controls['envValue'].value).toStrictEqual('PRO') - }) - - it('##getEnvList failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - }, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getEnvList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##getEnvList failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.getEnvList() - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取列表数据失败!') - }) - - it('##testCluster successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - nodes: [ - { name: 'name1', adminAddr: 'addr1', serviceAddr: 'addr1', status: 'NOTRUNNING' }, - { name: 'name2', adminAddr: 'addr2', serviceAddr: 'addr2', status: 'NOTRUNNING' }, - { name: 'name3', adminAddr: 'addr3', serviceAddr: 'addr3', status: 'RUNNING' }, - { name: 'name4', adminAddr: 'addr4', serviceAddr: 'addr4', status: 'RUNNING' } - ], - source: 'tttttttttttt', - isUpdate: true - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - - component.validateForm.controls['clusterAddr'].setValue(null) - component.testCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).toHaveBeenCalled() - - component.validateForm.controls['clusterAddr'].setValue('123.123.123:111') - component.testCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(2) - - component.validateForm.controls['clusterAddr'].setValue('http:123.123.123.123::') - component.testCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(3) - - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.testCluster() - fixture.detectChanges() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(3) - expect(component.nodesList).toStrictEqual([ - { name: 'name1', adminAddr: 'addr1', serviceAddr: 'addr1', status: 'NOTRUNNING' }, - { name: 'name2', adminAddr: 'addr2', serviceAddr: 'addr2', status: 'NOTRUNNING' }, - { name: 'name3', adminAddr: 'addr3', serviceAddr: 'addr3', status: 'RUNNING' }, - { name: 'name4', adminAddr: 'addr4', serviceAddr: 'addr4', status: 'RUNNING' } - ]) - expect(component.clusterCanBeCreated).toStrictEqual(true) - expect(component.source).toStrictEqual('tttttttttttt') - expect(component.testPassAddr).toStrictEqual('http://123.123.123:123') - }) - - it('##testCluster failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - }, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - - component.testCluster() - fixture.detectChanges() - - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##testCluster failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: -1, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.testCluster() - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('操作失败!') - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - }) - - it('##saveCluster successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - }, - msg: 'success' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - const spyFormMarkAllAsTouched = jest.spyOn(component.validateForm, 'markAllAsTouched') - // @ts-ignore - const spyRouterNavigate = jest.spyOn(component.router, 'navigate') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).not.toHaveBeenCalled() - expect(spyRouterNavigate).not.toHaveBeenCalled() - - component.validateForm.controls['clusterAddr'].setValue(null) - component.saveCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterNavigate).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalled() - - component.validateForm.controls['clusterAddr'].setValue('123.123.123:111') - component.saveCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).toHaveBeenCalled() - expect(spyRouterNavigate).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalledTimes(2) - - component.validateForm.controls['clusterAddr'].setValue('http:123.123.123.123::') - component.saveCluster() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(3) - expect(spyRouterNavigate).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalledTimes(3) - - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.saveCluster() - fixture.detectChanges() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(3) - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterNavigate).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalledTimes(4) - - component.validateForm.controls['envValue'].setValue('PRO') - component.validateForm.controls['clusterName'].setValue('123') - component.saveCluster() - fixture.detectChanges() - expect(spyClusterMarkAsDirty).toHaveBeenCalledTimes(3) - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterNavigate).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalledTimes(5) - - component.validateForm.controls['envValue'].setValue('PRO') - component.validateForm.controls['clusterName'].setValue('test123_') - component.validateForm.controls['envValue'].setValue('123') - component.saveCluster() - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyFormMarkAllAsTouched).toHaveBeenCalledTimes(6) - expect(spyRouterNavigate).toHaveBeenCalled() - expect(spyRouterNavigate).toHaveBeenCalledWith(['/', 'deploy', 'cluster', 'content'], { queryParams: { clusterName: 'test123_' } }) - }) - - it('##saveCluster failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: -1, - data: { - }, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['envValue'].setValue('PRO') - component.validateForm.controls['clusterName'].setValue('test123_') - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.validateForm.controls['envValue'].setValue('123') - component.saveCluster() - fixture.detectChanges() - - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##saveCluster failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: -1, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - const spyClusterMarkAsDirty = jest.spyOn(component.validateForm.controls['clusterAddr'], 'markAsDirty') - - component.validateForm.controls['envValue'].setValue('PRO') - component.validateForm.controls['clusterName'].setValue('test123_') - component.validateForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.validateForm.controls['envValue'].setValue('123') - component.saveCluster() - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('新建集群失败!') - expect(spyClusterMarkAsDirty).not.toHaveBeenCalled() - }) - - it('##cancel test', () => { - // @ts-ignore - const spyOnRouterNavigate = jest.spyOn(component.router, 'navigate') - expect(spyOnRouterNavigate).not.toHaveBeenCalled() - - component.cancel() - expect(spyOnRouterNavigate).toHaveBeenCalled() - expect(spyOnRouterNavigate).toHaveBeenCalledWith(['/', 'deploy', 'cluster']) - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/environment/environment.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/environment/environment.component.spec.ts deleted file mode 100644 index 9b838b0f9..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/environment/environment.component.spec.ts +++ /dev/null @@ -1,493 +0,0 @@ -/* eslint-disable dot-notation */ -import { ComponentFixture, fakeAsync, flush, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { DeployClusterNodesComponent } from '../nodes/nodes.component' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { DeployClusterEnvironmentComponent } from './environment.component' -import { ReactiveFormsModule } from '@angular/forms' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('DeployClusterEnvironmentComponent test', () => { - let component: DeployClusterEnvironmentComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, ReactiveFormsModule, - RouterModule.forRoot([ - { - path: '', - component: DeployClusterEnvironmentComponent - }, - { - path: 'deploy/cluster/content/cert', - component: DeployClusterEnvironmentComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterEnvironmentComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##btn click', () => { - const spyOpenDrawer = jest.spyOn(component, 'openDrawer') - const spyDelete = jest.spyOn(component, 'delete') - expect(component.configsTableBody[0].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9') - expect(component.configsTableBody[0].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(component.configsTableBody[1].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9') - expect(component.configsTableBody[1].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(component.configsTableBody[2].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9') - expect(component.configsTableBody[2].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(component.configsTableBody[3].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9; text-align:center') - expect(component.configsTableBody[3].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(component.configsTableBody[4].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9') - expect(component.configsTableBody[4].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(component.configsTableBody[5].styleFn({ publish: 'DEFECT' })).toStrictEqual('background:#f9f9f9') - expect(component.configsTableBody[5].styleFn({ publish: 'test' })).toStrictEqual('') - - expect(spyDelete).not.toHaveBeenCalled() - expect(spyOpenDrawer).not.toHaveBeenCalled() - expect(component.configsTableBody[6].showFn({ publish: 'DEFECT' })).toStrictEqual(false) - expect(component.configsTableBody[6].showFn({ publish: 'test' })).toStrictEqual(true) - expect(component.configsTableBody[6].btns[0].click({ publish: 'test' })) - expect(spyDelete).not.toHaveBeenCalled() - expect(spyOpenDrawer).toHaveBeenCalledTimes(1) - expect(component.configsTableBody[6].btns[1].click({ publish: 'test' })) - expect(spyDelete).toHaveBeenCalledTimes(1) - expect(spyOpenDrawer).toHaveBeenCalledTimes(1) - - expect(component.configsTableBody[7].showFn({ publish: 'DEFECT' })).toStrictEqual(true) - expect(component.configsTableBody[7].btns[0].click({ publish: 'test' })) - expect(spyDelete).toHaveBeenCalledTimes(1) - expect(spyOpenDrawer).toHaveBeenCalledTimes(2) - expect(component.configsTableBody[7].showFn({ publish: 'test' })).toStrictEqual(false) - }) - - it('##should initial configsList', fakeAsync(() => { - expect(component.configsList).not.toBe([]) - })) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spySubscription = jest.spyOn(component.subscription, 'unsubscribe') - // @ts-ignore - expect(spySubscription).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spySubscription).toHaveBeenCalled() - }) - - // it('detect', fakeAsync(() => { - // const form = { value: '', detect: { value: '', show: false } } - // expect(form.value).toBe('') - // expect(form.detect.value).toBe('') - // component.detect(form) - // tick(100) - // flush() - // expect(form.value).toBe('') - // expect(form.detect.value).toBe('') - - // const form2 = { value: 'test', detect: { value: '', show: false } } - // expect(form2.value).toBe('test') - // expect(form2.detect.value).toBe('') - // component.detect(form2) - // tick(100) - // flush() - // expect(form2.value).toBe('test') - // expect(form2.detect.value).toBe('{test}') - - // const form3 = { value: 'test test', detect: { value: '', show: false } } - // expect(form3.value).toBe('test test') - // expect(form3.detect.value).toBe('') - // component.detect(form3) - // tick(100) - // flush() - // expect(form3.value).toBe('test test') - // expect(form3.detect.value).toBe('{test#空格#test}') - - // const form4 = { value: 'test t\nest', detect: { value: '', show: false } } - // component.detect(form4) - // tick(100) - // flush() - // expect(form4.detect.value).toBe('{test#空格#t#换行符#est}') - // })) - - it('getConfigsList', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { variables: ['test'] } })) - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - component.getConfigsList() - - expect(spyService).toHaveBeenCalled() - expect(component.configsList).toStrictEqual(['test']) - - const spyService2 = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 2, data: { } })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - - component.getConfigsList() - - expect(spyMessageError).toBeCalledTimes(1) - expect(spyService2).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('deleteConfig', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 0, data: { variables: ['test'] } })) - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const item = { key: '123' } - expect(spyMessageSuccess).not.toHaveBeenCalled() - component.deleteConfig(item) - expect(spyService).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - - const spyService2 = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 2, data: { } })) - - component.deleteConfig(item) - - expect(spyService2).toHaveBeenCalled() - expect(spyMessageError).toHaveBeenCalledTimes(1) - }) - - it('click table btns', () => { - const spyOpendrawer = jest.spyOn(component, 'openDrawer') - // const spyDeleteCert = jest.spyOn(component, 'deleteCert') - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyOpendrawer).toHaveBeenCalledTimes(0) - expect(spyModal).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.configsTableBody[6].btns[0].click(item) - expect(spyOpendrawer).toHaveBeenCalledTimes(1) - component.configsTableBody[6].btns[1].click(item) - expect(spyModal).toHaveBeenCalledTimes(1) - component.configsTableBody[7].btns[0].click(item) - expect(spyOpendrawer).toHaveBeenCalledTimes(2) - }) - - it('openDrawer without http request', fakeAsync(() => { - expect(component.drawerRef).toBeUndefined() - component.openDrawer('addConfig') - fixture.detectChanges() - flush() - expect(component.drawerRef).not.toBeUndefined() - - component.drawerRef = undefined - component.openDrawer('editConfig', { id: 0 }) - fixture.detectChanges() - flush() - expect(component.drawerRef).not.toBeUndefined() - })) - - it('openDrawer with success http request', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get') - .mockReturnValue(of({ - code: 0, - data: { - info: { - clusters: [{ test: 'test1' }], - variables: [{ test: 'test2' }] - }, - version_name: 'test_version_name', - source: 'test_source', - unpublish_msg: 'unpublish_msg' - } - })) - - const isget = httpCommonService.get('') !== null - - expect(component.drawerRef).toBeUndefined() - component.openDrawer('updateConfig', { id: 0 }) - expect(spyService).toHaveBeenCalledTimes(2) - expect(isget).toBe(true) - fixture.detectChanges() - expect(component.drawerRef).not.toBeUndefined() - expect(component.clustersList).toStrictEqual([{ test: 'test1' }]) - expect(component.updateConfigsList).toStrictEqual([{ test: 'test2' }]) - - component.drawerRef = undefined - component.openDrawer('operateRecords', { id: 0 }) - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(3) - expect(component.drawerRef).not.toBeUndefined() - expect(component.operateRecordsData).toStrictEqual({ - info: { - clusters: [{ test: 'test1' }], - variables: [{ test: 'test2' }] - }, - version_name: 'test_version_name', - source: 'test_source', - unpublish_msg: 'unpublish_msg' - }) - - component.drawerRef = undefined - component.openDrawer('publishRecords', { id: 0 }) - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(4) - expect(component.drawerRef).not.toBeUndefined() - expect(component.publishRecordsData).toStrictEqual({ - info: { - clusters: [{ test: 'test1' }], - variables: [{ test: 'test2' }] - }, - version_name: 'test_version_name', - source: 'test_source', - unpublish_msg: 'unpublish_msg' - }) - - component.drawerRef = undefined - component.openDrawer('publish', { id: 0 }) - expect(spyService).toHaveBeenCalledTimes(5) - fixture.detectChanges() - expect(component.drawerRef).not.toBeUndefined() - expect(component.publishData).toStrictEqual({ - info: { - clusters: [{ test: 'test1' }], - variables: [{ test: 'test2' }] - }, - version_name: 'test_version_name', - source: 'test_source', - variables: [], - unpublish_msg: 'unpublish_msg' - }) - expect(component.validatePublishForm.controls['version_name'].value).toStrictEqual('test_version_name') - expect(component.unpublish_msg).toStrictEqual('unpublish_msg') - }) - - it('openDrawer with fail http request', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get') - .mockReturnValue(of({ - code: -1, - data: {} - })) - - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - - expect(spyMessageError).not.toHaveBeenCalled() - - expect(component.drawerRef).toBeUndefined() - component.openDrawer('updateConfig', { id: 0 }) - expect(spyService).toHaveBeenCalledTimes(2) - expect(isget).toBe(true) - fixture.detectChanges() - expect(component.drawerRef).not.toBeUndefined() - expect(spyMessageError).toBeCalledTimes(1) - - component.drawerRef = undefined - component.openDrawer('operateRecords', { id: 0 }) - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(3) - expect(component.drawerRef).not.toBeUndefined() - expect(spyMessageError).toBeCalledTimes(2) - - component.drawerRef = undefined - component.openDrawer('publishRecords', { id: 0 }) - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(4) - expect(component.drawerRef).not.toBeUndefined() - expect(spyMessageError).toBeCalledTimes(3) - - component.drawerRef = undefined - component.openDrawer('publish', { id: 0 }) - expect(spyService).toHaveBeenCalledTimes(5) - fixture.detectChanges() - expect(component.drawerRef).not.toBeUndefined() - expect(spyMessageError).toBeCalledTimes(4) - }) - - it('save with success', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 0, data: { certicates: ['test'] } })) - const spyService2 = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { certicates: ['test'] } })) - const spyGetConfigsList = jest.spyOn(component, 'getConfigsList') - - component.openDrawer('addConfig', { id: 0 }) - component.drawerRef!.close = () => { - return 'drawer is close' - } - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - - const spyFn = jest.spyOn(component.drawerRef!, 'close') - expect(spyFn).not.toHaveBeenCalled() - component.validateAddConfigForm.controls['key'].setValue('test_') - component.save('addConfig') - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyFn).toHaveBeenCalled() - expect(spyGetConfigsList).toHaveBeenCalledTimes(1) - - component.clustersList = [{ name: 'c1', env: 'default_value', status: 'test', id: 0, checked: true }, { name: 'c2', env: 'default_value', id: 0, status: 'test', checked: true }, { name: 'x3', env: 'default_value', id: 0, status: 'test', checked: true }] - component.updateConfigsList = [{ key: 'c1', value: 'default_value', variable_id: 0, publish: 'test', status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', id: 0, checked: true }, { key: 'c2', value: 'default_value', variable_id: 0, publish: 'test', id: 0, status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', checked: true }, { key: 'x3', value: 'default_value', variable_id: 0, publish: 'test', status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', id: 0, checked: true }] - - component.save('updateConfig') - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - - component.validatePublishForm.controls['version_name'].setValue('test') - component.publishData.is_publish = true - component.save('publish') - expect(spyMessageSuccess).toHaveBeenCalledTimes(3) - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyGetConfigsList).toHaveBeenCalledTimes(2) - - component.validateAddConfigForm.controls['key'].setValue('test_') - component.save('editConfig') - expect(spyService2).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(4) - expect(spyGetConfigsList).toHaveBeenCalledTimes(3) - - component.save('test') - expect(spyService2).toHaveBeenCalledTimes(1) - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyMessageSuccess).toHaveBeenCalledTimes(4) - expect(spyGetConfigsList).toHaveBeenCalledTimes(3) - }) - - it('save with fail', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 1, data: { certicates: ['test'] } })) - const spyService2 = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 1, data: { certicates: ['test'] } })) - - component.validateAddConfigForm.controls['key'].setValue('test_') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - component.save('addConfig') - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalledTimes(1) - - component.clustersList = [{ name: 'c1', env: 'default_value', status: 'test', id: 0, checked: true }, { name: 'c2', env: 'default_value', id: 0, status: 'test', checked: true }, { name: 'x3', env: 'default_value', id: 0, status: 'test', checked: true }] - component.updateConfigsList = [{ key: 'c1', value: 'default_value', variable_id: 0, publish: 'test', status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', id: 0, checked: true }, { key: 'c2', value: 'default_value', variable_id: 0, publish: 'test', id: 0, status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', checked: true }, { key: 'x3', value: 'default_value', variable_id: 0, publish: 'test', status: 'test', desc: 'test', operator: 'test', updateTime: 'test', createTime: 'test', id: 0, checked: true }] - - component.save('updateConfig') - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalledTimes(2) - - component.validatePublishForm.controls['version_name'].setValue('test') - component.publishData.is_publish = true - component.save('publish') - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyMessage).toHaveBeenCalledTimes(3) - - component.save('editConfig') - expect(spyService2).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalledTimes(4) - - component.save('test') - expect(spyService2).toHaveBeenCalledTimes(1) - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyMessage).toHaveBeenCalledTimes(4) - }) - - it('clearForm', fakeAsync(() => { - component.updateConfigForm.clusters = [{ name: 'test', env: 'test', id: 0 }] - component.updateConfigForm.variables = [{ key: 'test', value: 'test', variable_id: 0, id: 0 }] - - component.clearUpdateForm() - fixture.detectChanges() - - expect(component.updateConfigForm.clusters).toStrictEqual([]) - expect(component.updateConfigForm.variables).toStrictEqual([]) - for (const index in component.clustersList) { - expect(component.clustersList[index].checked).toStrictEqual(false) - } - for (const index in component.updateConfigsList) { - expect(component.updateConfigsList[index].checked).toStrictEqual(false) - } - })) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/list/list.component.spec.ts deleted file mode 100644 index 2d243e4ee..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/list/list.component.spec.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { DeployClusterNodesComponent } from '../nodes/nodes.component' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { - EoNgFeedbackDrawerService, - EoNgFeedbackModalService, - EoNgFeedbackMessageService -} from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { DeployClusterListComponent } from './list.component' -import { ElementRef } from '@angular/core' -import { ReactiveFormsModule } from '@angular/forms' -import { DeployClusterCreateComponent } from '../create/create.component' - -class MockDrawerService { - result: boolean = false - - nzAfterClose = new Subject() - - create () { - return { - afterClose: { - subscribe: () => { - of(this.result) - } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { - super(null) - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('DeployClusterListComponent test', () => { - let component: DeployClusterListComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - ReactiveFormsModule, - RouterModule.forRoot([ - { - path: '', - component: DeployClusterListComponent - }, - { - path: 'deploy/cluster/content/cert', - component: DeployClusterListComponent - }, - { - path: 'deploy/cluster/create', - component: DeployClusterCreateComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ]) - ], - declarations: [], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterListComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial configsList and environmentList', fakeAsync(() => { - expect(component.environmentList).not.toBe([]) - expect(component.clustersList).not.toBe([]) - })) - - it('click table btns', () => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - // const spyDeleteCert = jest.spyOn(component, 'deleteCert') - // @ts-ignore - const spyModalDelete = jest.spyOn(component, 'delete') - expect(spyRouter).toHaveBeenCalledTimes(0) - expect(spyModalDelete).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.clustersTableBody[3].btns[0].click(item) - expect(spyRouter).toHaveBeenCalledTimes(1) - component.clustersTableBody[3].btns[1].click(item) - expect(spyModalDelete).toHaveBeenCalledTimes(1) - expect(component.clustersTableBody[3].btns[1].disabledFn()).toStrictEqual( - false - ) - component.nzDisabled = true - expect(component.clustersTableBody[3].btns[1].disabledFn()).toStrictEqual( - true - ) - }) - - it('deleteCluster', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: 0, data: {} })) - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetClustersData).not.toHaveBeenCalled() - component.deleteCluster({ name: 'testName' }) - - expect(spyService).toHaveBeenCalled() - expect(spyGetClustersData).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - - const spyService2 = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: 2, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - component.deleteCluster({ name: 'testName' }) - - expect(spyService2).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('getClustersData', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - component.getClustersData() - - expect(spyService).toHaveBeenCalled() - expect(component.clustersList).toStrictEqual([1, 2, 3]) - - const spyService2 = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 2, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - component.getClustersData() - - expect(spyService2).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##disabledEdit', fakeAsync(() => { - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - component.disabledEdit(false) - expect(component.nzDisabled).toStrictEqual(false) - })) - - it('##clusterTableClick test', () => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - component.clusterTableClick({ data: { name: 'test' } }) - expect(spyRouter).toHaveBeenCalled() - expect(spyRouter).toHaveBeenCalledWith( - ['/', 'deploy', 'cluster', 'content'], - { - queryParams: { clusterName: 'test' } - } - ) - }) - - it('##addCluster test', () => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - component.addCluster() - expect(spyRouter).toHaveBeenCalled() - expect(spyRouter).toHaveBeenCalledWith(['/', 'deploy', 'cluster', 'create']) - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/cluster/nodes/nodes.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/cluster/nodes/nodes.component.spec.ts deleted file mode 100644 index 10f16bea6..000000000 --- a/frontend/projects/core/src/app/layout/deploy/cluster/nodes/nodes.component.spec.ts +++ /dev/null @@ -1,281 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - flush, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { - EoNgFeedbackDrawerService, - EoNgFeedbackModalService, - EoNgFeedbackMessageService -} from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { DeployClusterNodesComponent } from './nodes.component' -import { ReactiveFormsModule } from '@angular/forms' - -class MockDrawerService { - result: boolean = false; - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { - of(this.result) - } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('DeployClusterNodesComponent test', () => { - let component: DeployClusterNodesComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - ReactiveFormsModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: DeployClusterNodesComponent - }, - { - path: 'deploy/cluster/content/cert', - component: DeployClusterNodesComponent - }, - { - path: 'nodes', - component: DeployClusterNodesComponent - } - ]) - ], - declarations: [], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { - provide: EoNgFeedbackModalService, - useClass: MockEnsureService - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployClusterNodesComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial configsList', fakeAsync(() => { - expect(component.nodesForms.nodes).not.toBe([]) - })) - - it('getNodeslist', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 0, data: { variables: ['test'] } })) - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - component.getNodeslist() - - expect(spyService).toHaveBeenCalled() - expect(component.nodesForms).toStrictEqual({ variables: ['test'] }) - - const spyService2 = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: 2, data: {} })) - - component.getNodeslist() - - expect(spyMessageError).toBeCalledTimes(1) - expect(spyService2).toHaveBeenCalled() - }) - - it('updateNodes', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: 0, data: { variables: ['test'] } })) - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - - const spyGetNodesList = jest.spyOn(component, 'getNodeslist') - component.updateNodes() - - expect(spyService).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetNodesList).toHaveBeenCalled() - - const spyService2 = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: 2, data: {} })) - - component.updateNodes() - - expect(spyMessageError).toBeCalledTimes(1) - expect(spyService2).toHaveBeenCalled() - }) - - it('openDrawer without http request', fakeAsync(() => { - expect(component.nodesDrawerRef).toBeUndefined() - component.openDrawer('resetNodes') - fixture.detectChanges() - flush() - expect(component.nodesDrawerRef).not.toBeUndefined() - })) - - it('openDrawer, form value reset when drawer closed', fakeAsync(() => { - expect(component.nodesDrawerRef).toBeUndefined() - component.openDrawer('resetNodes') - fixture.detectChanges() - flush() - expect(component.nodesDrawerRef).not.toBeUndefined() - })) - - it('save', () => { - component.clusterName = 'gd_pro' - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: 0, data: {} })) - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - expect(spyService).toHaveBeenCalledTimes(0) - - component.validateResetNodeForm.controls['clusterAddr'].setValue('http') - component.save() - expect(spyService).toHaveBeenCalledTimes(0) - - component.validateResetNodeForm.controls['clusterAddr'].setValue('http://123.123.123:123') - component.save() - expect(spyService).toHaveBeenCalledTimes(1) - - const spyService2 = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - - expect(spyMessageError).not.toHaveBeenCalled() - component.save() - expect(spyService2).toHaveBeenCalled() - expect(spyMessageError).toHaveBeenCalled() - }) - - it('testCluster', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { nodes: [], source: 'testSource', isUpdate: true } - }) - ) - expect(spyService).toHaveBeenCalledTimes(0) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - - component.validateResetNodeForm.controls['clusterAddr'].setValue(null) - - component.testCluster() - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(0) - - component.validateResetNodeForm.controls['clusterAddr'].setValue('http://123.123.123:123') - - component.testCluster() - fixture.detectChanges() - expect(spyService).toHaveBeenCalledTimes(1) - expect(component.nodesTestList).toStrictEqual([]) - expect(component.clusterCanBeCreated).toStrictEqual(true) - expect(component.testPassAddr).toStrictEqual('http://123.123.123:123') - expect(component.nodesTestTableShow).toStrictEqual(false) - - const spyService2 = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { nodes: [1, 2, 3], source: 'testSource', isUpdate: true } - }) - ) - expect(spyService2).toHaveBeenCalledTimes(1) - - expect(component.testPassAddr).toStrictEqual('http://123.123.123:123') - - component.testCluster() - fixture.detectChanges() - expect(spyService2).toHaveBeenCalledTimes(2) - expect(component.nodesTestList).toStrictEqual([1, 2, 3]) - expect(component.clusterCanBeCreated).toStrictEqual(true) - expect(component.nodesTestTableShow).toStrictEqual(true) - - expect(spyMessageError).not.toHaveBeenCalled() - - const spyService3 = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, data: {} })) - expect(spyService3).toHaveBeenCalledTimes(2) - - expect(component.testPassAddr).toStrictEqual('http://123.123.123:123') - - component.testCluster() - fixture.detectChanges() - expect(spyService3).toHaveBeenCalledTimes(3) - expect(spyMessageError).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/environment/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/environment/create/create.component.spec.ts deleted file mode 100644 index bb477915a..000000000 --- a/frontend/projects/core/src/app/layout/deploy/environment/create/create.component.spec.ts +++ /dev/null @@ -1,206 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - flush, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { - EoNgFeedbackDrawerService, - EoNgFeedbackModalService, - EoNgFeedbackMessageService -} from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ReactiveFormsModule } from '@angular/forms' -import { DeployEnvironmentCreateComponent } from './create.component' -class MockDrawerService { - result: boolean = false - - nzAfterClose = new Subject() - - create() { - return { - afterClose: { - subscribe: () => { - of(this.result) - } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - error() { - return 'error' - } - - success() { - return 'success' - } -} - -class MockEnsureService { - create() { - return 'modal is create' - } -} - -describe('DeployEnvironmentCreateComponent test', () => { - let component: DeployEnvironmentCreateComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - ReactiveFormsModule, - RouterModule.forRoot([ - { - path: '', - component: DeployEnvironmentCreateComponent - }, - { - path: 'deploy/cluster/content/cert', - component: DeployEnvironmentCreateComponent - }, - { - path: 'nodes', - component: DeployEnvironmentCreateComponent - } - ]) - ], - declarations: [], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployEnvironmentCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spySubscription = jest.spyOn(component.subscription, 'unsubscribe') - // @ts-ignore - expect(spySubscription).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spySubscription).toHaveBeenCalled() - }) - - it('##save successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue( - of({ - code: 0, - data: { variables: [1, 2], total: 1 } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyRouterChange = jest.spyOn(component.router, 'navigate') - - component.save() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyRouterChange).not.toHaveBeenCalled() - component.validateForm.controls['key'].setValue('test_') - component.save() - fixture.detectChanges() - - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalledWith('新增环境变量成功!') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterChange).toHaveBeenCalled() - expect(spyRouterChange).toHaveBeenCalledWith(['/', 'deploy', 'variable']) - }) - - it('##save failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue( - of({ - code: -1, - data: {}, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyRouterChange = jest.spyOn(component.router, 'navigate') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterChange).not.toHaveBeenCalled() - component.validateForm.controls['key'].setValue('test_') - component.save() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyRouterChange).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##save failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue( - of({ - code: -1, - data: {} - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyRouterChange = jest.spyOn(component.router, 'navigate') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyRouterChange).not.toHaveBeenCalled() - component.validateForm.controls['key'].setValue('test_') - component.save() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyRouterChange).not.toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('新增环境变量失败!') - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/environment/environment.component.test.ts b/frontend/projects/core/src/app/layout/deploy/environment/environment.component.test.ts deleted file mode 100644 index 9eb510e84..000000000 --- a/frontend/projects/core/src/app/layout/deploy/environment/environment.component.test.ts +++ /dev/null @@ -1,240 +0,0 @@ -describe('环境变量 e2e test', () => { - it('初始化页面,点击基础设施-环境变量菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByText('基础设施').click() - await page.getByRole('link', { name: '环境变量' }).click() - }) - it('检查页面样式', async () => { - // 新建配置按钮 - const createBtn = await page.getByRole('button', { name: '新建配置' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 搜索组合 - const searchGroup = await page.locator('.list-header.block_lr div >> nth = 1') - const searchGroupH = await searchGroup.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(searchGroupH).toStrictEqual('32px') - - // key标签 - const keyLable = await page.locator('label').filter({ hasText: 'KEY' }) - const keyLableP = await keyLable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const keyLableM = await keyLable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(keyLableP).toStrictEqual('0px') - expect(keyLableM).toStrictEqual('0px') - - // key输入框 - const searchInput1 = await page.getByPlaceholder('请输入') - const searchInput1H = await searchInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInput1W = await searchInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInput1BC = await searchInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchInput1ML = await searchInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(searchInput1H).toStrictEqual('32px') - expect(searchInput1W).toStrictEqual('216px') - expect(searchInput1BC).toStrictEqual('rgb(215, 215, 215)') - expect(searchInput1ML).toStrictEqual('12px') - - // key标签 - const statusLable = await page.locator('label').filter({ hasText: 'KEY' }) - const statusLableP = await statusLable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const statusLableM = await statusLable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(statusLableP).toStrictEqual('0px') - expect(statusLableM).toStrictEqual('0px 0px 0px 24px') - - // 状态输入框 - const searchInput2 = await page.getByPlaceholder('请输入') - const searchInput2H = await searchInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInput2W = await searchInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInput2BC = await searchInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchInput2ML = await searchInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(searchInput2H).toStrictEqual('32px') - expect(searchInput2W).toStrictEqual('216px') - expect(searchInput2BC).toStrictEqual('rgb(215, 215, 215)') - expect(searchInput2ML).toStrictEqual('12px') - - // 重置按钮 - const resetBtn = await page.getByRole('button', { name: '发布历史' }) - const resetBtnM = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const resetBtnP = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const resetBtnBC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const resetBtnBGC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const resetBtnC = await resetBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(resetBtnM).toStrictEqual('0px 0px 0px 24px') - expect(resetBtnP).toStrictEqual('0px 12px') - expect(resetBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(resetBtnBGC).toStrictEqual('rgb(255, 255, 255)') - expect(resetBtnC).toStrictEqual('rgba(0, 0, 0, 0.85)') - - // 查询按钮 - const searchBtn = await page.getByRole('button', { name: '新建配置' }) - const searchBtnH = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchBtnW = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchBtnBG = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const searchBtnBC = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchBtnFS = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const searchBtnM = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const searchBtnP = await searchBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - expect(searchBtnH).toStrictEqual('32px') - expect(searchBtnW).toStrictEqual('54px') - expect(searchBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(searchBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(searchBtnFS).toStrictEqual('14px') - expect(searchBtnM).toStrictEqual('0px 24px 0px 12px') - expect(searchBtnP).toStrictEqual('0px 12px') - }) - it('点击新建配置,检查样式;逐一填入必输项,直至保存后返回列表', async () => { - await page.getByRole('button', { name: '新建配置' }).click() - - // 应用名称输入框样式 - const nameInput = await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 描述样式 - const descInput = await page.getByPlaceholder('请输入') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 重置按钮 - const saveBtn = await page.getByRole('button', { name: '保存' }) - const saveBtnM = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const saveBtnP = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const saveBtnBC = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const saveBtnBGC = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const saveBtnC = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(saveBtnM).toStrictEqual('0px') - expect(saveBtnP).toStrictEqual('0px 12px') - expect(saveBtnBGC).toStrictEqual('rgb(34, 84, 157)') - expect(saveBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(saveBtnC).toStrictEqual('rgb(255, 255, 255)') - - // 查询按钮 - const cancleBtn = await page.getByRole('button', { name: '取消' }) - const cancleBtnH = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const cancleBtnW = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const cancleBtnBG = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnBC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancleBtnFS = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const cancleBtnM = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const cancleBtnP = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - expect(cancleBtnH).toStrictEqual('32px') - expect(cancleBtnW).toStrictEqual('54px') - expect(cancleBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(cancleBtnBG).toStrictEqual('rgb(255, 255, 255)') - expect(cancleBtnFS).toStrictEqual('14px') - expect(cancleBtnM).toStrictEqual('0px 0px 0px 12px') - expect(cancleBtnP).toStrictEqual('0px 12px') - - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').fill('testValue') - await page.getByRole('button', { name: '保存' }).click() - }) - it('点击新建配置,点击取消后返回列表', async () => { - await page.getByRole('button', { name: '新建配置' }).click() - await page.getByPlaceholder('请输入').click() - await page.getByPlaceholder('请输入').fill('testdesc') - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击新建配置,点击面包屑返回列表', async () => { - await page.getByRole('button', { name: '新建配置' }).click() - await page.getByText('环境变量 / 新建配置 /').click() - await page.locator('nz-breadcrumb').getByRole('link', { name: '环境变量' }).click() - }) - it('点击表格,出现环境变量弹窗,检查样式并关闭', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').first().click() - await page.getByText('查看环境变量').click() - const drawerTable = await page.locator('.drawer-table') - const drawerTableM = await drawerTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerTableP = await drawerTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - expect(drawerTableM).toStrictEqual('10px auto 0px auto') - expect(drawerTableP).toStrictEqual('0px') - await page.getByRole('button', { name: 'Close' }).click() - }) - it('测试表格中的图标', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button').first() - await page.getByText('查看环境变量').click() - await page.getByRole('button', { name: 'Close' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button').last() - await page.getByText('该数据删除后将无法找回,请确认是否删除?').click() - await page.locator('.ant-modal-footer').getByRole('button', { name: '取消' }).click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button').last() - await page.getByText('该数据删除后将无法找回,请确认是否删除?').click() - await page.locator('.ant-modal-footer').getByRole('button', { name: '确定' }).click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/deploy/environment/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/deploy/environment/list/list.component.spec.ts deleted file mode 100644 index a48bebb77..000000000 --- a/frontend/projects/core/src/app/layout/deploy/environment/list/list.component.spec.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { - ComponentFixture, - fakeAsync, - flush, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { - EoNgFeedbackDrawerService, - EoNgFeedbackModalService, - EoNgFeedbackMessageService -} from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { DeployEnvironmentListComponent } from './list.component' -import { ReactiveFormsModule } from '@angular/forms' -class MockDrawerService { - result: boolean = false - - nzAfterClose = new Subject() - - create() { - return { - afterClose: { - subscribe: () => { - of(this.result) - } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - error() { - return 'error' - } - - success() { - return 'success' - } -} - -class MockEnsureService { - create() { - return 'modal is create' - } -} - -describe('DeployEnvironmentListComponent test', () => { - let component: DeployEnvironmentListComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - ReactiveFormsModule, - RouterModule.forRoot([ - { - path: '', - component: DeployEnvironmentListComponent - }, - { - path: 'deploy/cluster/content/cert', - component: DeployEnvironmentListComponent - }, - { - path: 'nodes', - component: DeployEnvironmentListComponent - } - ]) - ], - declarations: [], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(DeployEnvironmentListComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial globalEnvForms', fakeAsync(() => { - expect(component.globalEnvForms.variables).not.toBe([]) - })) - - it('resetSearch', fakeAsync(() => { - component.searchForm = { - key: 'test', - status: 'test' - } - component.resetSearch() - fixture.detectChanges() - flush() - expect(component.searchForm.key).toStrictEqual('') - expect(component.searchForm.status).toStrictEqual('') - })) - - it('##click table btns', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get') - const spyDeleteModal = jest.spyOn(component, 'deleteModal') - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyDeleteModal).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.globalEnvTableBody[5].btns[0].click(item) - expect(spyService).toHaveBeenCalledTimes(1) - - expect(component.globalEnvTableBody[5].btns[1].disabledFn()).toStrictEqual( - false - ) - component.globalEnvTableBody[5].btns[1].click(item) - expect(spyDeleteModal).toHaveBeenCalledTimes(1) - }) - - it('##search', () => { - const spyFn = jest.spyOn(component, 'getVariables') - expect(spyFn).toHaveBeenCalledTimes(0) - - component.search() - expect(spyFn).toHaveBeenCalledTimes(1) - }) - - it('##openDrawer without http request', fakeAsync(() => { - expect(component.editConfigDrawerRef).toBeUndefined() - component.openDrawer('view') - fixture.detectChanges() - flush() - expect(component.editConfigDrawerRef).not.toBeUndefined() - })) - - it('##deleteModal test', fakeAsync(() => { - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyModal).not.toHaveBeenCalled() - component.deleteModal('test') - expect(spyModal).toHaveBeenCalled() - })) - - it('##getVariables successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { test: 'test', total: 1 }, - msg: 'success' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.getVariables() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component.globalEnvForms).toStrictEqual({ test: 'test', total: 1 }) - expect(component.variablePage.total).toStrictEqual(1) - }) - - it('##getVariables failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: -1, - data: {}, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.getVariables() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##getVariables failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: -1, - data: {} - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.getVariables() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取列表数据失败!') - }) - - it('##delete successfully', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue( - of({ - code: 0, - data: { variables: [1, 2], total: 1 }, - msg: 'success' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetVariables = jest.spyOn(component, 'getVariables') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetVariables).not.toHaveBeenCalled() - component.delete({ key: 'test' }) - fixture.detectChanges() - - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyGetVariables).toHaveBeenCalled() - }) - - it('##delete failed', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue( - of({ - code: -1, - data: {}, - msg: 'faild' - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetVariables = jest.spyOn(component, 'getVariables') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyGetVariables).not.toHaveBeenCalled() - component.delete({ key: 'test' }) - fixture.detectChanges() - - expect(spyGetVariables).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('faild') - }) - - it('##delete failed without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue( - of({ - code: -1, - data: {} - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component.delete({ key: 'test' }) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('删除失败!') - }) -}) diff --git a/frontend/projects/core/src/app/layout/iframe-page/iframe-page.component.ts b/frontend/projects/core/src/app/layout/iframe-page/iframe-page.component.ts deleted file mode 100644 index bfd2bdfc3..000000000 --- a/frontend/projects/core/src/app/layout/iframe-page/iframe-page.component.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { Component, OnInit } from '@angular/core' -import { IframeHttpService } from '../../service/iframe-http.service' -import { ApiService } from '../../service/api.service' -import { EoNgNavigationService } from '../../service/eo-ng-navigation.service' -import { NavigationEnd, Router } from '@angular/router' -import { BaseInfoService } from '../../service/base-info.service' -import { Subscription } from 'rxjs' - -@Component({ - selector: 'eo-ng-iframe-page', - template: ` - -
-
- `, - styles: [ - ` - :host{ - display:block; - height:100%; - overflow-y:hidden; - } - :host ::ng-deep{ - nz-spin.iframe-spin, - nz-spin.iframe-spin >.ant-spin-container, - #iframePanel, - #iframePanel > iframe{ - width:100%; - height:100%; - border:none; - } - }` - ] -}) -export class IframePageComponent implements OnInit { - iframe:any = null - proxyHandler:{[k:string]:any} ={ - ...this.iframeService.apinto2PluginApi, - test: function (params:any) { - const response = params - return new Promise(resolve => { - setTimeout(function () { - resolve('this is response for call test("' + response + '")') - }, 1) - }) - } - } - - listenMessage =async (event:any) => { - if (event && event.data.apinto && event.data.type === 'request') { - this.start = true - const handler = this.proxyHandler[event.data.path as any] - if (typeof handler === 'function') { - const args = event.data.data - const result = await handler(...args) - try { - result.data = this.api.underline(result.data) - } catch { - console.warn('转化接口数据命名法出现问题') - } - - ;(this.iframe as any).contentWindow.postMessage({ - requestId: event.data.requestId, - magic: 'apinto', - type: 'response', - data: JSON.parse(JSON.stringify(result)), - apinto: true - }, '*') - } else { - ;(this.iframe as any).contentWindow.postMessage({ - requestId: event.data.requestId, - magic: 'apinto', - apinto: true, - type: 'error', - data: 'unknown function for:' + event.data.path - }, '*') - } - } - } - - // changeUrl=true时,表示传入的url是已经处理好的,不需要再根据router.url拼接。暂时用在面包屑场景 - showIframe = (id: any, url: any, initData: any, noChangeUrl?:boolean) => { - const createIframe = (id: string, url: string) => { - const iframe = document.createElement('iframe') - iframe.id = id - iframe.width = '100%' - iframe.height = '100%' - iframe.src = url - iframe.onload = () => { - this.start = true - } - - return iframe - } - - if (noChangeUrl) { - this.iframe.src = url - return - } - this.iframe = createIframe('iframe', `${url}${this.router.url.includes('#') ? this.router.url.split('#')[1] : ''}`) - const onLoadCallback = () => { - this.start = true - ;(this.iframe as any).contentWindow.postMessage({ apinto: true, type: 'initialize', data: initData }, '*') - window.addEventListener('message', this.listenMessage) - } - if ((this.iframe as any).attachEvent) { - (this.iframe as any).attachEvent('onload', onLoadCallback) - } else { - (this.iframe as any).addEventListener('load', onLoadCallback) - } - const panel = document.getElementById('iframePanel') - while (panel?.hasChildNodes()) { - panel?.firstChild && panel.removeChild(panel?.firstChild) - } - panel?.appendChild(this.iframe) - } - - // 当组件销毁时需要通知iframe注销 - stopIframe () { - window.removeEventListener('message', this.listenMessage) - ;(this.iframe as any).contentWindow?.postMessage({ - type: 'stopConnection', - apinto: true - }, '*') - } - - path:string ='' - - start:boolean = false - iframeSrc:string = '' - iframeDom:Window|null = null - moduleName:string = '' - initMessage:object|null = null - private subscription: Subscription = new Subscription() - private subscription2: Subscription = new Subscription() - - constructor (private iframeService:IframeHttpService, private api:ApiService, - private navigation:EoNgNavigationService, private router:Router, - private baseInfo:BaseInfoService) {} - - ngOnInit (): void { - this.moduleName = this.baseInfo.allParamsInfo.moduleName - this.iframeService.moduleName = this.moduleName - // 此处监听的是切换module事件,需要判断moduleName是否变化 - this.subscription = this.router.events.subscribe((event) => { - if (event instanceof NavigationEnd) { - if (this.moduleName !== this.baseInfo.allParamsInfo.moduleName) { - this.moduleName = this.baseInfo.allParamsInfo.moduleName - this.iframeService.moduleName = this.moduleName - this.iframeService.subscription.unsubscribe() - this.showIframe('test', `agent/${this.moduleName}`, {}) - } - // this.getPath() - } - }) - - this.subscription2 = this.iframeService.repFlashIframe().subscribe((event) => { - this.showIframe('test', `agent/${this.moduleName}`, {}) - this.showIframe('test', `agent/${this.moduleName}${event ? `/${event}` : ''}`, {}, true) - }) - // this.getPath() - } - - ngAfterViewInit () { - this.showIframe('test', `agent/${this.moduleName}`, {}) - this.moduleName = this.baseInfo.allParamsInfo.moduleName - this.iframeService.moduleName = this.moduleName - } - - ngOnDestroy () { - this.stopIframe() - this.subscription.unsubscribe() - this.iframeService.subscription.unsubscribe() - this.subscription2.unsubscribe() - } - - getPath () { - this.initMessage = null - this.api.get('system/module', { name: this.moduleName }).subscribe((resp:any) => { - if (resp.code === 0) { - if (resp.data.module.query) { - this.path = `${resp.data.module.path}${this.router.url.includes('#') ? '/' + this.router.url.split('#')[1] : ''}?` - } - for (const queryParams of resp.data.module.query) { - this.path = `${this.path}${queryParams.name}=${queryParams.value}&` - } - this.getIframeSrc({ headers: resp.data.module.header }) - if (resp.data.module.initialize) { - this.initMessage = this.getInitMessage(resp.data.module.initialize) - } - } - }) - } - - getInitMessage (initializeData:Array<{key:string, value:any, type:string}>) { - const res:{[k:string]:any} = {} - for (const data of initializeData) { - switch (data.type) { - case 'string': { - res[data.key] = res[data.value] - break - } - case 'number': { - res[data.key] = Number(res[data.value]) - break - } - case 'boolean': { - res[data.key] = Boolean(res[data.value]) - break - } - case 'array': { - res[data.key] = [this.getInitMessage(data.value)] - break - } - case 'object': { - res[data.key] = { ...this.getInitMessage(data.value) as any } - break - } - } - } - return res - } - - // 打开的iframe可能需要传入header - getIframeSrc (options?:any) { - this.start = true - this.iframeService.openIframe(this.path, options).subscribe((blob) => { - this.iframeSrc = blob - if (this.initMessage) { - window.top?.postMessage({ apinto: true, type: 'init', initialize: this.initMessage }, '*') - } - }) - } - - onLoad () { - if (this.start) { - this.iframeDom = (document.getElementById('iframe')).contentWindow - this.iframeDom?.postMessage({ data: 'test', apinto: true }, '*') - this.initIframeChange() - } - } - - initIframeChange () { - const elemIfram = document.getElementById('iframe')! - if (window.MutationObserver) { - // chrome - const callback = (mutations: any[]) => { - mutations.forEach((mutation: { oldValue: any; target: { src: any; }; }) => { - this.iframeSrcChanged(mutation.oldValue, mutation.target.src, mutation.target) - }) - } - const observer = new MutationObserver(callback) - - observer.observe(elemIfram, { - attributes: true, - attributeOldValue: true - }) - } - } - - iframeSrcChanged (oldValue:string, newValue:string, iframeObj:any) { - console.log('旧地址:' + oldValue) - console.log('新地址:' + newValue) - // if (newValue.indexOf('aaaa') > -1) { - // console.log('有危险,请马上离开……') - // iframeObj.src = oldValue// 钓鱼地址,恢复原url - // } else { - // console.log('安全地址,允许跳转……') - // } - } -} diff --git a/frontend/projects/core/src/app/layout/login/login.component.spec.ts b/frontend/projects/core/src/app/layout/login/login.component.spec.ts deleted file mode 100644 index 8a2872000..000000000 --- a/frontend/projects/core/src/app/layout/login/login.component.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-07-30 00:40:51 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-03 23:20:22 - * @FilePath: /apinto/src/app/layout/basic-layout/basic-layout.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { APP_BASE_HREF } from '@angular/common' -import { HttpClientModule } from '@angular/common/http' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { RouterModule } from '@angular/router' -import { EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { environment } from 'projects/core/src/environments/environment' -import { of } from 'rxjs' -import { API_URL } from '../../service/api.service' -import { LoginComponent } from './login.component' -import { Overlay } from '@angular/cdk/overlay' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -describe('LoginComponent test', () => { - let component: LoginComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - RouterModule.forRoot([ - { - path: '**', - component: LoginComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(LoginComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('check Auth access and return success in init', () => { - // @ts-ignore - const spyService = jest.spyOn(component.api, 'checkAuth').mockReturnValue(of({ code: 0, data: { } })) - // @ts-ignore - const spyGetMenuList = jest.spyOn(component.navigationService, 'getMenuList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyGetMenuList).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.ngOnInit() - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyGetMenuList).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('check Auth access and return fail in init', () => { - // @ts-ignore - const spyService = jest.spyOn(component.api, 'checkAuth').mockReturnValue(of({ code: -1, data: { } })) - // @ts-ignore - const spyGetMenuList = jest.spyOn(component.navigationService, 'getMenuList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyGetMenuList).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.ngOnInit() - fixture.detectChanges() - - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledTimes(1) - }) - - it('unsubscribe in ngOnDestroy', fakeAsync(() => { - // @ts-ignore - const spyUnsubscribe = jest.spyOn(component.subscription, 'unsubscribe') - expect(spyUnsubscribe).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spyUnsubscribe).toHaveBeenCalledTimes(1) - })) -}) diff --git a/frontend/projects/core/src/app/layout/login/login.component.test.ts b/frontend/projects/core/src/app/layout/login/login.component.test.ts deleted file mode 100644 index 44739f50b..000000000 --- a/frontend/projects/core/src/app/layout/login/login.component.test.ts +++ /dev/null @@ -1,274 +0,0 @@ -describe('login e2e test', () => { - it('login 左侧图片宽360px,高度100%', async () => { - // Go to http://localhost:4200/login - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - const pic = await page.locator('nz-sider div >> nth=2') - const width = await pic.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - - expect(width).toStrictEqual('360px') - }) - - it('标题字号32px,不加粗,标题与下方次标题间距44px', async () => { - const title = await page.locator('text=欢迎来到 Apinto') - const titleFrontSize = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(titleFrontSize).toStrictEqual('32px') - const titleFrontWeight = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(titleFrontWeight).toStrictEqual('400') - - const titleMarginBottom = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(titleMarginBottom).toStrictEqual('44px') - }) - - it('次标题字16px,不加粗,次标题底部96px*1px', async () => { - const title = await page.locator('text=账号密码登录') - const titleFrontSize = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(titleFrontSize).toStrictEqual('16px') - const titleFrontWeight = await title.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(titleFrontWeight).toStrictEqual('400') - - const titleDiv = await page.locator('div:has-text("账号密码登录") >> nth=2') - const titleDivWidth = await titleDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(titleDivWidth).toStrictEqual('96px') - - const titleDivBorderWidth = await titleDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-bottom-width')) - expect(titleDivBorderWidth).toStrictEqual('1px') - }) - - it('次标题与输入框间距28px,输入框372px*40px, 登录按钮372px*42px,输入框之间间距20px,输入框与按钮间距49px', async () => { - // 次标题与输入框间距28px - const formDiv = await page.locator('form:has-text("登录")') - const formDivPaddingTop = await formDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-top')) - expect(formDivPaddingTop).toStrictEqual('28px') - - // 输入框372px*40px, 输入框之间间距20px - const accountInput = await page.locator('[placeholder="请输入账号"]') - const accInputW = await accountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(accInputW).toStrictEqual('372px') - - const accInputH = await accountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(accInputH).toStrictEqual('40px') - - const accInputDiv = await page.locator('nz-form-item').nth(0) - const accInputDivMarginBottom = await accInputDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(accInputDivMarginBottom).toStrictEqual('20px') - - const pswInput = await page.locator('[placeholder="请输入密码"]') - const pswInputW = await pswInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(pswInputW).toStrictEqual('372px') - - const pswInputH = await pswInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(pswInputH).toStrictEqual('40px') - - const pswInputDiv = await page.locator('nz-form-item').nth(1) - const pswInputDivMarginBottom = await pswInputDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(pswInputDivMarginBottom).toStrictEqual('20px') - - // 登录按钮372px*42px,输入框与按钮间距49px - const loginButton = await page.locator('button:has-text("登录")') - const loginButtonMarginTop = await loginButton.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(loginButtonMarginTop).toStrictEqual('29px') - - const loginButtonW = await loginButton.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(loginButtonW).toStrictEqual('372px') - - const loginButtonH = await loginButton.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(loginButtonH).toStrictEqual('42px') - }) - - it('次标题与按钮背景色为主题色', async () => { - const titleDiv = await page.locator('.login-tab') - const titleDivBgC = await titleDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(titleDivBgC).toStrictEqual('rgb(34, 84, 157)') - const titleDivBoderC = await titleDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-bottom-color')) - expect(titleDivBoderC).toStrictEqual('rgb(34, 84, 157)') - }) - - it('未输入账号密码,点击登录,则输入框下方出现提示语,提示语下方存在20px间距', async () => { - const accInputDiv = await page.locator('nz-form-item').nth(0) - const accInputDivMarginBottom = await accInputDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(accInputDivMarginBottom).toStrictEqual('20px') - - const pswInputDiv = await page.locator('nz-form-item').nth(1) - const pswInputDivMarginBottom = await pswInputDiv.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - expect(pswInputDivMarginBottom).toStrictEqual('20px') - }) - - it('输入错误账号密码,提示登录失败;输入正确账号密码,跳转进入项目', async () => { - // Click [placeholder="请输入账号"] - await page.locator('[placeholder="请输入账号"]').click() - // Fill [placeholder="请输入账号"] - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('11111') - // Click button:has-text("登录") - await page.locator('button:has-text("登录")').click() - // Click #cdk-overlay-0 div:has-text("密码错误") >> nth=3 - await page.locator('#cdk-overlay-0 div:has-text("密码错误")').nth(3).click() - - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - // Click button:has-text("登录") - await page.locator('button:has-text("登录")').click() - // Click #cdk-overlay-0 div:has-text("登录成功") >> nth=3 - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - // Click .logo - await page.locator('.logo').click() - - await page.locator('.avatar.mg-top-right').click() - - await page.getByText('退出登录').click() - - await page.getByRole('heading', { name: '欢迎来到 Apinto' }).click() - }) - it('输入无权限账号密码,跳转进入项目,主页出现权限提示提示框.提示框436px*186px, 标题与字体间距24px,字体为14px,标题字体加粗,管理员三字为蓝色, 右下角按钮间间距12px,按钮与右侧间距20px,下方间距24px,右侧按钮为主题色', async () => { - // 输入无权限账号,出现提示框 - await page.locator('input[placeholder="请输入账号"]').click() - await page.locator('input[placeholder="请输入账号"]').fill('testNoAccess') - await page.locator('input[placeholder="请输入密码"]').click() - await page.locator('input[placeholder="请输入密码"]').fill('12345678') - - await page.getByRole('button', { name: '登录' }).click() - await page.locator('.ant-modal').click() - - // 提示框样式 - const tipBox = await page.locator('.ant-modal-body') - const tipBoxHeight = await tipBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(tipBoxHeight).toStrictEqual('186px') - const tipBoxWidth = await tipBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - expect(tipBoxWidth).toStrictEqual('436px') - - const tipBoxPadding = await tipBox.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(tipBoxPadding).toStrictEqual('20px') - - const tipBoxTitleIcon = await page.locator('.anticon.anticon-exclamation-circle') - - const tipBoxTitleIconFontSize = await tipBoxTitleIcon.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(tipBoxTitleIconFontSize).toStrictEqual('20px') - - const tipBoxTitleIconMarginRight = await tipBoxTitleIcon.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - expect(tipBoxTitleIconMarginRight).toStrictEqual('8px') - - const tipBoxTitleText = await page.locator('.ant-modal-confirm-title') - - const tipBoxTitleTextFontSize = await tipBoxTitleText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(tipBoxTitleTextFontSize).toStrictEqual('14px') - - const tipBoxTitleTextMarginRight = await tipBoxTitleText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(tipBoxTitleTextMarginRight).toStrictEqual('500') - - const tipBoxContent = await page.locator('.modal-header').last() - - const tipBoxContentMarginTop = await tipBoxContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(tipBoxContentMarginTop).toStrictEqual('24px') - - const tipBoxContentMarginRight = await tipBoxTitleIcon.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - expect(tipBoxContentMarginRight).toStrictEqual('8px') - - const tipBoxManager = await page.locator('text=管理员') - - const tipBoxManagerColor = await tipBoxManager.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(tipBoxManagerColor).toStrictEqual('rgb(0, 0, 255)') - - const tipBoxBtns = await page.locator('.ant-modal-confirm-btns') - - const tipBoxBtnsMarginTop = await tipBoxBtns.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - expect(tipBoxBtnsMarginTop).toStrictEqual('24px') - - const tipBoxBtnsFloat = await tipBoxBtns.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('float')) - expect(tipBoxBtnsFloat).toStrictEqual('right') - - const tipBoxBtnsRight = await page.locator('role=button[name="确定"]') - - const tipBoxBtnsRightMarginLeft = await tipBoxBtnsRight.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - expect(tipBoxBtnsRightMarginLeft).toStrictEqual('12px') - - const tipBoxBtnsRightColor = await tipBoxBtnsRight.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - expect(tipBoxBtnsRightColor).toStrictEqual('rgb(34, 84, 157)') - - await page.getByRole('button', { name: '确定' }).click() - - await page.locator('div:has-text("网关控制台")').click() - - await page.locator('.avatar.mg-top-right').click() - - await page.getByText('退出登录').click() - - await page.getByRole('heading', { name: '欢迎来到 Apinto' }).click() - }) - it('点击取消,则关闭提示框,页面不做跳转', async () => { - await page.locator('input[placeholder="请输入账号"]').click() - await page.locator('input[placeholder="请输入账号"]').fill('testNoAccess') - await page.locator('input[placeholder="请输入密码"]').click() - await page.locator('input[placeholder="请输入密码"]').fill('12345678') - await page.getByRole('button', { name: '登录' }).click() - await page.locator('.ant-modal-body').click() - - await page.getByRole('button', { name: '取消' }).click() - - await page.locator('div:has-text("网关控制台")').click() - - await page.locator('.avatar.mg-top-right').click() - - await page.getByText('退出登录').click() - - await page.getByRole('heading', { name: '欢迎来到 Apinto' }).click() - }) - - it('点击关闭,则关闭提示框,页面不做跳转', async () => { - await page.locator('input[placeholder="请输入账号"]').click() - await page.locator('input[placeholder="请输入账号"]').fill('testNoAccess') - await page.locator('input[placeholder="请输入密码"]').click() - await page.locator('input[placeholder="请输入密码"]').fill('12345678') - await page.getByRole('button', { name: '登录' }).click() - await page.locator('.ant-modal-close-x').click() - - await page.locator('div:has-text("网关控制台")').click() - - await page.locator('.avatar.mg-top-right').click() - - await page.getByText('退出登录').click() - - await page.getByRole('heading', { name: '欢迎来到 Apinto' }).click() - }) -}) diff --git a/frontend/projects/core/src/app/layout/login/password/password.component.spec.ts b/frontend/projects/core/src/app/layout/login/password/password.component.spec.ts deleted file mode 100644 index c40fe7b55..000000000 --- a/frontend/projects/core/src/app/layout/login/password/password.component.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -/* eslint-disable dot-notation */ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-07-30 00:40:51 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-03 23:20:22 - * @FilePath: /apinto/src/app/layout/basic-layout/basic-layout.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { APP_BASE_HREF } from '@angular/common' -import { HttpClientModule } from '@angular/common/http' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { RouterModule } from '@angular/router' -import { EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { environment } from 'projects/core/src/environments/environment' -import { of } from 'rxjs' -import { API_URL } from '../../../service/api.service' -import { Overlay } from '@angular/cdk/overlay' -import { PasswordComponent } from './password.component' -import { ReactiveFormsModule } from '@angular/forms' -import { NzFormModule } from 'ng-zorro-antd/form' -import { CryptoService } from '../../../service/crypto.service' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -describe('PasswordComponent test', () => { - let component: PasswordComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - ReactiveFormsModule, - NzFormModule, - RouterModule.forRoot([ - { - path: '**', - component: PasswordComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: CryptoService, useClass: CryptoService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - ] - }).compileComponents() - - fixture = TestBed.createComponent(PasswordComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('initial validateForm in ngOnInit and focus on password input', fakeAsync(() => { - const spyService = jest.spyOn(component.autoFocusInput.nativeElement, 'focus') - component.validateForm.controls['username'].setValue('test') - component.validateForm.controls['password'].setValue('test') - - expect(spyService).not.toHaveBeenCalled() - component.ngOnInit() - - expect(component.validateForm.controls['username'].value).toStrictEqual(null) - expect(component.validateForm.controls['password'].value).toStrictEqual(null) - - component.ngAfterViewInit() - - expect(spyService).toHaveBeenCalled() - })) - - it('validateForm is valid and login is success without callbackUrl',fakeAsync(() => { - // @ts-ignore - const spyLogin = jest.spyOn(component.api, 'login').mockReturnValue({ code: 0, data: {} }) - // @ts-ignore - const spyReqFlashMenu = jest.spyOn(component.appConfig, 'reqFlashMenu') - // @ts-ignore - const spyNavigate = jest.spyOn(component.router, 'navigate') - // @ts-ignore - component.validateForm.controls['username'].setValue('admin') - component.validateForm.controls['password'].setValue('12345678') - component.validateForm.updateValueAndValidity() - expect(component.validateForm.valid).toStrictEqual(true) - expect(spyLogin).not.toHaveBeenCalled() - expect(spyReqFlashMenu).not.toHaveBeenCalled() - expect(spyNavigate).not.toHaveBeenCalled() - // @ts-ignore - component.route.snapshot.queryParams['callback'] = null - component.login() - expect(spyLogin).toHaveBeenCalled() - expect(spyLogin).toHaveBeenCalledWith({ - username:'admin', - password:'XebnGrBSaQuxIODzaGTGZw==', - client: 1, - type: 1, - app_type: 4}) - expect(spyReqFlashMenu).toHaveBeenCalled() - expect(spyNavigate).toHaveBeenCalled() - })) - - it('validateForm is valid and login is success with callbackUrl', () => { - - }) - - it('validateForm is valid and login is fail', () => { - }) - - it('validateForm is unvalid and login', () => { - }) -}) diff --git a/frontend/projects/core/src/app/layout/navigation/create/create.component.html b/frontend/projects/core/src/app/layout/navigation/create/create.component.html deleted file mode 100644 index 0d11715b5..000000000 --- a/frontend/projects/core/src/app/layout/navigation/create/create.component.html +++ /dev/null @@ -1,110 +0,0 @@ -
- - 导航名称: - - - - - - - 图标: - - - -
- - - -
- - - - - - - - -
- -
- 请上传64*64px的png图标,大小100k以内 -
-
-
-
- - - - 子导航配置: - - -
- - - - - -
-
-
-
-
-
diff --git a/frontend/projects/core/src/app/layout/navigation/create/create.component.ts b/frontend/projects/core/src/app/layout/navigation/create/create.component.ts deleted file mode 100644 index 0ff463ebc..000000000 --- a/frontend/projects/core/src/app/layout/navigation/create/create.component.ts +++ /dev/null @@ -1,190 +0,0 @@ -/* eslint-disable dot-notation */ -import { Component } from '@angular/core' -import { FormArray, FormControl, FormGroup, UntypedFormBuilder, Validators } from '@angular/forms' -import { NzUploadFile } from 'ng-zorro-antd/upload' -import { defaultAutoTips } from '../../../constant/conf' -import { EmptyHttpResponse } from '../../../constant/type' -import { ApiService } from '../../../service/api.service' -import { EoNgMessageService } from '../../../service/eo-ng-message.service' -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop' -import { NzModalRef } from 'ng-zorro-antd/modal' -import { NavigationData } from '../types/types' -import { v4 as uuidv4 } from 'uuid' - -const getBase64 = (file: File): Promise => - new Promise((resolve, reject) => { - const reader = new FileReader() - reader.readAsDataURL(file) - reader.onload = () => resolve(reader.result) - reader.onerror = error => reject(error) - }) - -@Component({ - selector: 'eo-ng-navigation-create', - templateUrl: './create.component.html', - styles: [ - `:host ::ng-deep{ - .ant-upload.ant-upload-select-picture-card{ - height:64px; - width:64px; - - [nz-upload-btn]{ - display:block; - } - } - - .icon-image:hover + svg.delete-icon{ - opacity:1 !important; - } - - svg.delete-icon:hover{ - opacity:1 !important; - border:1px solid var(--primary-color) !important; - } - - - .child-navigation .ant-form-item-explain{ - margin-left:32px; - } - } - -` - ] -}) -export class NavigationCreateComponent { - autoTips: Record> = defaultAutoTips - validateForm: FormGroup = new FormGroup({ }) - - fileList: NzUploadFile[] = []; - iconSvg:string = '' // 导航图标为iconpark时 - editPage:boolean = false - navigationUuid:string = '' - listOfControl: Array<{ id: number; controlInstance: string }> = []; - imageUrl:string = '' || './assets/default-navigation-icon.png' - - modalRef:NzModalRef|undefined - get childArray () { - return this.validateForm.get('children') as FormArray - } - - constructor ( - private fb: UntypedFormBuilder, private api: ApiService, private message:EoNgMessageService - ) { - } - - // 手动上传文件 - beforeUpload = (file: NzUploadFile): boolean => { - this.fileList = [] - this.fileList = this.fileList.concat(file) - this.handlerFileChange() - return false - } - - // 移除文件 - removeFile () { - this.fileList = [] - return true - } - - ngOnInit (): void { - this.validateForm = this.fb.group({ - name: ['', [Validators.required]], - children: this.fb.array([]) - }) - if (this.editPage) { - this.getNavMessage() - } - } - - dataURLtoFile (dataUrl:string, fileName:string = '') { - const arr = dataUrl.split(',') - const mime = arr[0].match(/:(.*?);/)![1] - const bstr = atob(arr[1]); let n = bstr.length - const u8arr = new Uint8Array(n) - while (n--) { - u8arr[n] = bstr.charCodeAt(n) - } - return new File([u8arr], fileName, { type: mime }) - } - - getNavMessage () { - this.api.get(`system/navigation/${this.navigationUuid}`).subscribe((resp:{code:number, msg:string, data:{navigation:NavigationData}}) => { - if (resp.code === 0) { - this.validateForm.patchValue( - { - name: resp.data.navigation.title - } - ) - this.fileList = resp.data.navigation.iconType === 'css' ? [] : [this.dataURLtoFile(resp.data.navigation.icon) as any] - this.iconSvg = resp.data.navigation.iconType === 'css' ? resp.data.navigation.icon : '' - this.handlerFileChange() - const childArray = this.validateForm.controls['children'] as FormArray - resp.data.navigation.modules.forEach((module:{id:string, title:string}) => { - const childGroup = new FormGroup({}) - childGroup.addControl('id', new FormControl(module.id)) - childGroup.addControl('title', new FormControl(module.title, [Validators.required])) - childArray.push(childGroup) - }) - } - }) - } - - drop (event: CdkDragDrop) { - const childList = this.validateForm.controls['children'].value - moveItemInArray(childList, event.previousIndex, event.currentIndex) - this.validateForm.controls['children'].setValue(childList) - } - - async submit () { - if (this.validateForm.controls['name'].invalid) { - this.validateForm.controls['name'].markAsDirty() - this.validateForm.controls['name'].updateValueAndValidity({ onlySelf: true }) - } - - if (this.editPage && this.validateForm.controls['children'].invalid) { - this.validateForm.controls['children'].markAsDirty() - this.validateForm.controls['children'].updateValueAndValidity({ onlySelf: true }) - return - } - - if (this.validateForm.controls['name'].invalid) { - return - } - const iconBase64 = this.fileList.length ? await getBase64(this.fileList[0] as any) : (this.iconSvg || '') - if (this.editPage) { - this.api.put(`system/navigation/${this.navigationUuid}`, { - name: this.validateForm.controls['name'].value, - icon: iconBase64, - modules: this.validateForm.controls['children'].value, - iconType: this.iconSvg ? 'css' : '' - }).subscribe((resp:EmptyHttpResponse) => { - if (resp.code === 0) { - this.message.success(resp.msg || '编辑导航成功') - this.modalRef?.close() - } - }) - } else { - this.api.post('system/navigation', { - name: this.validateForm.controls['name'].value, - icon: iconBase64, - uuid: uuidv4() - }).subscribe((resp:EmptyHttpResponse) => { - if (resp.code === 0) { - this.message.success(resp.msg || '新建导航成功') - this.modalRef?.close() - } - }) - } - } - - async handlerFileChange () { - this.imageUrl = this.fileList.length ? await getBase64(this.fileList[0] as any) as string : './assets/default-navigation-icon.png' - } - - deleteIcon (e:Event) { - e?.stopPropagation() - this.fileList = [] - this.iconSvg = '' - this.handlerFileChange() - } -} diff --git a/frontend/projects/core/src/app/layout/navigation/navigation-routing.module.ts b/frontend/projects/core/src/app/layout/navigation/navigation-routing.module.ts deleted file mode 100644 index 8bc4a8cf4..000000000 --- a/frontend/projects/core/src/app/layout/navigation/navigation-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { NavigationComponent } from './navigation.component' - -const routes: Routes = [ - { - path: '', - component: NavigationComponent - } -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class NavigationRoutingModule { } diff --git a/frontend/projects/core/src/app/layout/navigation/navigation.component.html b/frontend/projects/core/src/app/layout/navigation/navigation.component.html deleted file mode 100644 index 3fe5c6491..000000000 --- a/frontend/projects/core/src/app/layout/navigation/navigation.component.html +++ /dev/null @@ -1,78 +0,0 @@ -
-
- -
-
-
- -
    -
  • -
      - - - - -
    -
    - - - - - - - - - {{ item.title }} -
    -
  • -
-
diff --git a/frontend/projects/core/src/app/layout/navigation/navigation.component.ts b/frontend/projects/core/src/app/layout/navigation/navigation.component.ts deleted file mode 100644 index 265f94dfa..000000000 --- a/frontend/projects/core/src/app/layout/navigation/navigation.component.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Component, OnInit } from '@angular/core' -import { EoNgFeedbackModalService } from 'eo-ng-feedback' -import { MODAL_SMALL_SIZE } from '../../constant/app.config' -import { NavigationCreateComponent } from './create/create.component' -import { moveItemInArray, CdkDragDrop } from '@angular/cdk/drag-drop' -import { ApiService } from '../../service/api.service' -import { NavigationItem } from './types/types' -import { EmptyHttpResponse } from '../../constant/type' -import { NzModalRef } from 'ng-zorro-antd/modal' -import { EoNgMessageService } from '../../service/eo-ng-message.service' -import { EoNgNavigationService } from '../../service/eo-ng-navigation.service' - -@Component({ - selector: 'eo-ng-navigation', - templateUrl: './navigation.component.html', - styles: [ - `:host ::ng-deep{ - .ant-list-bordered{ - border:1px solid var(--border-color); - } - - .ant-list-split .ant-list-item{ - border-bottom:1px solid var(--border-color); - } - - .draggable-list { - display: block; - border-radius: 4px; - overflow: hidden; - } - - .draggable-item { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - cursor: move; - } - - .cdk-drag-placeholder { - opacity: 0; - } - - .cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } - - .draggable-item:last-child { - border: none; - } - } - - ` - ] -}) -export class NavigationComponent implements OnInit { - navigationList:Array = [] - modalRef:NzModalRef|undefined - - constructor (private modalService:EoNgFeedbackModalService, private api:ApiService, private message:EoNgMessageService, - private navigationService: EoNgNavigationService) { - this.navigationService.reqFlashBreadcrumb([ - { title: '导航管理' } - ]) - } - - ngOnInit () { - this.getNavigationList() - } - - getNavigationList () { - this.api.get('system/navigation').subscribe((resp:{code:number, msg:string, data:{navigations:Array}}) => { - if (resp.code === 0) { - this.navigationList = resp.data.navigations - } - }) - } - - disableNavigationModal (uuid:string) { - this.modalRef = this.modalService.create({ - nzTitle: '删除', - nzContent: '该数据删除后将无法找回,请确认是否删除?', - nzClosable: true, - nzClassName: 'delete-modal', - nzWidth: MODAL_SMALL_SIZE, - nzOkText: '确定', - nzOkDanger: true, - nzCancelText: '取消', - nzOnOk: () => { - this.disableNavigation(uuid) - return false - } - }) - } - - // 删除分组 - disableNavigation (uuid:string) { - this.api.delete(`system/navigation/${uuid}`).subscribe((resp:EmptyHttpResponse) => { - if (resp.code === 0) { - this.message.success(resp.msg || '删除成功') - this.modalRef?.close() - } - }) - } - - openNavigationModal (add:boolean, uuid?:string) { - this.modalRef = this.modalService.create({ - nzTitle: add ? '新建导航' : '编辑导航', - nzWidth: MODAL_SMALL_SIZE, - nzContent: NavigationCreateComponent, - nzComponentParams: { ...(!add ? { editPage: !add, navigationUuid: uuid } : {}), modalRef: this.modalRef }, - nzOnOk: (component:NavigationCreateComponent) => { - component.submit() - return false - } - }) - } - - drop (event: CdkDragDrop) { - const tmpNavigationList:Array = [...this.navigationList] - moveItemInArray(tmpNavigationList, event.previousIndex, event.currentIndex) - this.api.put('system/navigation', { - navigations: tmpNavigationList.map((nav:NavigationItem) => { - return nav.uuid - }) - }).subscribe((resp:EmptyHttpResponse) => { - if (resp.code === 0) { - moveItemInArray(this.navigationList, event.previousIndex, event.currentIndex) - this.message.success(resp.msg || '操作成功') - } - }) - } -} diff --git a/frontend/projects/core/src/app/layout/navigation/navigation.module.ts b/frontend/projects/core/src/app/layout/navigation/navigation.module.ts deleted file mode 100644 index b52bf6675..000000000 --- a/frontend/projects/core/src/app/layout/navigation/navigation.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { NzListModule } from 'ng-zorro-antd/list' -import { NavigationRoutingModule } from './navigation-routing.module' -import { NavigationComponent } from './navigation.component' -import { EoNgButtonModule } from 'eo-ng-button' -import { NavigationCreateComponent } from './create/create.component' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { NzUploadModule } from 'ng-zorro-antd/upload' -import { EoNgApintoTableModule } from 'projects/eo-ng-apinto-table/src/public-api' -import { EoNgInputModule } from 'eo-ng-input' -import { NzFormModule } from 'ng-zorro-antd/form' -import { DragDropModule } from '@angular/cdk/drag-drop' -import { EoNgEmptyModule } from 'eo-ng-empty' -import { NzIconModule } from 'ng-zorro-antd/icon' - -@NgModule({ - declarations: [ - NavigationComponent, - NavigationCreateComponent - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - NzUploadModule, - NavigationRoutingModule, - NzListModule, - NzFormModule, - EoNgButtonModule, - EoNgApintoTableModule, - EoNgInputModule, - DragDropModule, - EoNgEmptyModule, - NzIconModule - ], - exports: [ - NavigationComponent - ] -}) -export class NavigationModule { } diff --git a/frontend/projects/core/src/app/layout/navigation/types/types.ts b/frontend/projects/core/src/app/layout/navigation/types/types.ts deleted file mode 100644 index 22f7aacc4..000000000 --- a/frontend/projects/core/src/app/layout/navigation/types/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type NavigationItem = { - uuid:string - title:string - icon:string - canDelete:boolean - iconType:string -} - -export type NavigationData = { - uuid:string - title:string - icon:string - iconType:string - modules:Array<{ - id:string - title:string - }> -} diff --git a/frontend/projects/core/src/app/layout/outer/outer.component.ts b/frontend/projects/core/src/app/layout/outer/outer.component.ts deleted file mode 100644 index f341b07ff..000000000 --- a/frontend/projects/core/src/app/layout/outer/outer.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component } from '@angular/core' - -@Component({ - selector: 'eo-ng-outer', - template: ` - - `, - styles: [ - ] -}) -export class OuterComponent { - -} diff --git a/frontend/projects/core/src/app/layout/serv-governance/cache/cache.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/cache/cache.component.test.ts deleted file mode 100644 index 65d8ffb8b..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/cache/cache.component.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('服务治理-缓存策略 e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - await page.locator('button:has-text("登录")').click() - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - - await page.locator('eo-ng-menu-default div:has-text("服务治理")').click() - await page.getByRole('link', { name: '缓存策略' }).click() - }) - - it('保存按钮为primary,未添加数据时,点击保存按钮将出现错误提示 ', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-form-item-explain-error >> nth = 0').click() - }) - - it('添加条件按钮为primary,点击后出现弹窗,配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.locator('eo-ng-select#name').last().click() - - await page.locator('text=API').nth(1).click() - await page.waitForTimeout(200) - - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - const transferBtn1 = await page.locator('.ant-transfer-operation button >> nth =0') - let transferBtn1Disabled = await transferBtn1.isDisabled() - - const transferBtn2 = await page.locator('.ant-transfer-operation button >> nth =1') - const transferBtn2Disabled = await transferBtn2.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await expect(transferBtn2Disabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').click() - await page.locator('input[type="checkbox"] >> nth=2').click() - transferBtn1Disabled = await transferBtn1.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(false) - - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - }) - - it('属性名称选择API路径时, 输入框未有值时, 保存按钮置灰, 输入值不符合正则时,保存按钮置灰,反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('button:has-text("添加条件")').last().click() - await page.locator('eo-ng-select#name').last().click() - await page.waitForTimeout(400) - await page.locator('text=API路径').click() - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('11 11') - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - expect(await (await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength + 1) - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - const saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.getByText('API请求方式').click() - await page.getByLabel('ALL').check() - await page.locator('eo-ng-filter-footer >> nth = 0 >>.ant-btn-primary').click() - await expect(await page.locator('eo-ng-filter-table >> nth = 0 >> tbody tr td:has-text("所有API请求方式")').isVisible()).toStrictEqual(true) - }) - it('点击添加条件按钮, 之前选择过的属性不会出现在列表中 点击取消时, 弹窗消失, 列表行数不变', async () => { - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - await page.locator('button:has-text("添加条件")').last().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API请求方式")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API")').isVisible()).toStrictEqual(false) - await page.locator('eo-ng-filter-footer .ml-btnbase').last().click() - - await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - }) - - // it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.getByRole('cell', { name: 'API' }).click() - // // await page.locator('eo-ng-filter-table tbody tr >> nth = 0 >> td >> nth =2 >> button >> nth = 0').first().click() - // await page.waitForTimeout(2000) - - // await page.locator('input[type="checkbox"] >> nth=0').click() - // await page.locator('.ant-transfer-operation button >> nth =1').click() - // await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - - // await page.locator('.icon-shanchu >> nth = 2').click() - // await page.locator('.nz-modal-footer button:has-text("取消")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - - // await page.locator('.icon-shanchu >> nth = 1').click() - // await page.locator('.nz-modal-footer button:has-text("确定")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - // }) - - // it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // await page.locator('.icon-a-peizhianniu_huaban1 >> nth = 1').click() - // await page.getByLabel('DELETE').uncheck() - // await page.getByLabel('ALL').check() - // // Click button:has-text("保存") - // await page.locator('eo-ng-filter-footer .ant-btn-primary:has-text("提交")').click() - // }) - - // it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('[placeholder="请输入API路径"]').fill('test1') - // await page.locator('eo-ng-filter-footer button:has-text("提交")').click() - // await page.getByRole('cell', { name: 'test1' }).click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - // }) - - it('点击添加条件,选择ip地址,当输入的不符合正则时,出现错误提示且无法提交', async () => { - await page.getByRole('button', { name: '添加条件' }).first().click() - await page.locator('eo-ng-select#name').last().click() - await page.getByText('IP').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111') - await page.getByText('输入的IP或CIDR不符合格式').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111.111.111') - await page.locator('eo-ng-filter-footer:has-text("保存 取消")').getByRole('button', { name: '保存' }).click() - }) - - it('填写所有必填项,点击保存,页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.locator('nz-form-item').filter({ hasText: '策略名称必填项' }).getByRole('alert').click() - await page.locator('nz-form-control').filter({ hasText: '必填项单位:s,最小值:1' }).getByRole('alert').click() - - await page.getByPlaceholder('请输入首字母为英文,英文数字下划线任意一种组合').fill('testForE2e') - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - - await page.getByPlaceholder('请输入有效时间').click() - await page.getByPlaceholder('请输入有效时间').fill('1') - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - - await page.getByText('success').click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - await page.getByRole('cell', { name: 'testForE2e' }).last().click() - await page.getByText('缓存策略 / testForE2e /').click() - await page.getByRole('button', { name: '提交' }).click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - const priorityInput = await page.locator('input#priority') - const priorityInputW = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const priorityInputH = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(priorityInputW).toStrictEqual('346px') - await expect(priorityInputH).toStrictEqual('32px') - - const visitRuleInput = await page.getByPlaceholder('请输入有效时间') - const visitRuleInputW = await visitRuleInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const visitRuleInputH = await visitRuleInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(visitRuleInputW).toStrictEqual('346px') - await expect(visitRuleInputH).toStrictEqual('32px') - - const filterBtn1 = await page.getByRole('button', { name: '添加条件' }).first() - const filterBtn1W = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn1H = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn1BGC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const filterBtn1BC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const filterBtn1C = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn1W).toStrictEqual('82px') - await expect(filterBtn1H).toStrictEqual('32px') - await expect(filterBtn1BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn1BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn1C).toStrictEqual('rgba(0, 0, 0, 0.85)') - // filterBtn1.hover() - // filterBtn1BC = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(filterBtn1BC).toStrictEqual('rgb(34, 84, 157)') - // filterBtn1C = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(filterBtn1C).toStrictEqual('rgb(34, 84, 157)') - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/cache/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/cache/create/create.component.spec.ts deleted file mode 100644 index 0e66d8eec..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/cache/create/create.component.spec.ts +++ /dev/null @@ -1,517 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { CacheCreateComponent } from './create.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('CacheCreateComponent test as editPage is false', () => { - let component: CacheCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: CacheCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [CacheCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2', strategy_uuid: 'uuid' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(CacheCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - }) - - it('##ngOnChanges test', () => { - component.strategyUuid = '' - component.createStrategyForm.uuid = '1' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('1') - - component.strategyUuid = '123' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('123') - }) - - it('##getStrategyMessage with success return (without optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const mockValue1: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - config: { - } - } - } - } - - const expectCreateStrategyForm: any = { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - filters: [], - config: { - } - } - - const expValidateForm: any = { - name: 'default_value', - desc: 'default_value', - priority: null, - validTime: 1 - } - - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue1)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - - expect(component.createStrategyForm).toStrictEqual(expectCreateStrategyForm) - expect(component.validateForm.value).toStrictEqual(expValidateForm) - expect(component.filterNamesSet).toStrictEqual(new Set()) - expect(component.filterShowList).toStrictEqual([]) - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategyMessage with success return (with optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - validTime: 55 - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(component.createStrategyForm).toStrictEqual({ - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - validTime: 55 - } - }) - expect(component.filterNamesSet).toStrictEqual(new Set(['testF'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'testF', uuid: '123' } - ]) - expect(spyService).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - })) - - it('## saveStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyBackToList = jest.spyOn(component, 'backToList') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - component.filterShowList = [{ title: 'test1', label: 'test1', name: 'test1', values: [''] }, { title: 'test2', label: 'test2', name: 'test2', values: [''] }, { title: 'test3', label: 'test3', name: 'test3', values: [] }] - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(2222) - component.validateForm.controls['validTime'].setValue(55) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['validTime'].setValue(55) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['validTime'].setValue(null) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['validTime'].setValue(55) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).toBeCalledWith('创建成功!') - - expect(component.createStrategyForm.filters).toStrictEqual([ - { name: 'test1', values: [''] }, - { name: 'test2', values: [''] }, - { name: 'test3', values: [] } - ]) - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyBackToList).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##saveStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: -1, data: {} })) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(22) - component.validateForm.controls['validTime'].setValue(2) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('创建失败!') - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) - - it('##backToList test', fakeAsync(() => { - // @ts-ignore - const spyBack = jest.spyOn(component.location, 'back') - expect(spyBack).not.toHaveBeenCalled() - - component.backToList() - tick(100) - expect(spyBack).toHaveBeenCalled() - })) -}) - -describe('CacheCreateComponent test as editPage is false', () => { - let component: CacheCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: CacheCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [CacheCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(CacheCreateComponent) - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/filter/footer/footer.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/filter/footer/footer.component.spec.ts deleted file mode 100644 index ffecc2122..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/filter/footer/footer.component.spec.ts +++ /dev/null @@ -1,357 +0,0 @@ -import { - ComponentFixture, - fakeAsync, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../../cache/create/create.component' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { TrafficCreateComponent } from '../../traffic/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { FilterFooterComponent } from './footer.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('FilterFooterComponent test as editPage is false', () => { - let component: FilterFooterComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [FilterFooterComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FilterFooterComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##saveFilter test', fakeAsync(() => { - component.filterForm = { - name: 'api', - title: 'API', - label: 'API', - text: '', - total: 3, - values: ['5'], - pattern: /./, - patternIsPass: true - } - component.remoteSelectList = ['1', '2', '3'] - component.remoteSelectNameList = ['11', '22', '33'] - component.filterType = 'remote' - - component.saveFilter() - expect(component.filterForm.values).toStrictEqual(['ALL']) - expect(component.filterForm.text).toStrictEqual('所有API') - expect(component.filterNamesSet).toStrictEqual(new Set(['api'])) - component.filterForm = { - name: 'api', - title: 'API', - label: 'API', - text: '', - total: 3, - values: ['5'], - pattern: /./, - patternIsPass: true - } - component.remoteSelectList = ['3'] - component.remoteSelectNameList = ['33'] - component.filterType = 'remote' - - component.saveFilter() - expect(component.filterForm.values).toStrictEqual(['3']) - expect(component.filterForm.text).toStrictEqual('33') - - component.filterType = 'static' - component.filterForm = { - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - text: '', - allChecked: false, - total: 3, - values: [], - pattern: /./, - patternIsPass: true - } - - component.staticsList = [ - { label: 'ALL', value: 'ALL', checked: false }, - { label: 'POST', value: 'POST', checked: true }, - { label: 'PUT', value: 'PUT', checked: false }, - { label: 'GET', value: 'GET', checked: true } - ] - - component.saveFilter() - expect(component.filterForm.values).toStrictEqual(['POST', 'GET']) - expect(component.filterForm.text).toStrictEqual('POST,GET') - - component.filterForm = { - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - text: '', - allChecked: true, - total: 3, - values: [], - pattern: /./, - patternIsPass: true - } - - component.saveFilter() - expect(component.filterForm.values).toStrictEqual(['ALL']) - expect(component.filterForm.text).toStrictEqual('所有API请求方式') - - component.filterForm = { - name: 'path', - title: 'API路径', - label: 'API路径', - text: '', - total: undefined, - values: ['1'], - pattern: /./, - patternIsPass: true - } - component.filterType = 'pattern' - component.saveFilter() - expect(component.filterForm.text).toStrictEqual('1') - - const ef: any = { - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - allChecked: true, - total: 3, - values: [], - pattern: /./, - patternIsPass: true - } - - component.editFilter = ef - - // @ts-ignore - component.filterForm = { - title: 'test5', - name: 'test5', - text: 'test5', - values: [], - pattern: /./, - patternIsPass: true - } - // @ts-ignore - component.filterShowList = [ - { name: 'test1', label: '1', title: '1', values: [] }, - { name: 'test3', label: '3', title: '3', values: [] }, - ef, - { name: 'test4', label: '4', title: '4', values: [] } - ] - - component.filterNamesSet = new Set(['methods', 'test4']) - - component.filterType = 'static' - component.saveFilter() - expect(component.filterShowList).toStrictEqual([ - { name: 'test1', label: '1', title: '1', values: [] }, - { name: 'test3', label: '3', title: '3', values: [] }, - { name: 'test4', label: '4', title: '4', values: [] }, - { - title: 'test5', - name: 'test5', - label: 'POST,GET', - values: ['POST', 'GET'] - } - ]) - expect(component.filterNamesSet).toStrictEqual(new Set(['test4', 'test5'])) - })) - - it('##checkFilterToSave test', fakeAsync(() => { - component.filterType = 'static' - // @ts-ignore - component.filterForm = { - filterType: 'static', - allChecked: false, - values: [] - } - let res = component.checkFilterToSave() - expect(res).toStrictEqual(true) - - // @ts-ignore - component.filterForm = { - filterType: 'static', - allChecked: true, - values: [] - } - res = component.checkFilterToSave() - expect(res).toStrictEqual(false) - - component.filterType = 'pattern' - // @ts-ignore - component.filterForm = { - filterType: 'pattern', - allChecked: true, - pattern: /\w+/, - patternIsPass: false, - values: [' 1'] - } - res = component.checkFilterToSave() - expect(res).toStrictEqual(true) - - // @ts-ignore - component.filterForm = { - filterType: 'pattern', - allChecked: true, - pattern: /\w+/, - patternIsPass: true, - values: [' 1'] - } - - res = component.checkFilterToSave() - expect(res).toStrictEqual(false) - - // @ts-ignore - component.filterForm = { - filterType: 'pattern', - pattern: null, - allChecked: true, - values: [] - } - - res = component.checkFilterToSave() - expect(res).toStrictEqual(true) - - // @ts-ignore - component.filterForm = { - filterType: 'pattern', - pattern: null, - allChecked: true, - values: ['111:111:111'] - } - - res = component.checkFilterToSave() - expect(res).toStrictEqual(false) - - component.filterType = 'remote' - component.filterForm.allChecked = false - component.remoteSelectList = [] - - res = component.checkFilterToSave() - expect(res).toStrictEqual(true) - - component.filterForm.allChecked = false - component.remoteSelectList = ['1'] - - res = component.checkFilterToSave() - expect(res).toStrictEqual(false) - - component.filterForm.allChecked = true - component.remoteSelectList = [] - - res = component.checkFilterToSave() - expect(res).toStrictEqual(false) - })) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/filter/form/form.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/filter/form/form.component.spec.ts deleted file mode 100644 index cc54a5af5..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/filter/form/form.component.spec.ts +++ /dev/null @@ -1,991 +0,0 @@ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { TransferChange } from 'ng-zorro-antd/transfer' -import { CacheCreateComponent } from '../../cache/create/create.component' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { TrafficCreateComponent } from '../../traffic/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { FilterFormComponent } from './form.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('FilterFormComponent test as editPage is false', () => { - let component: FilterFormComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [FilterFormComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FilterFormComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getFilterNamesList()', () => { - const spyGetFilterNamesList = jest.spyOn(component, 'getFilterNamesList') - expect(spyGetFilterNamesList).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetFilterNamesList).toHaveBeenCalledTimes(1) - }) - - it('##getFilterNamesList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - options: [ - { name: 'api', title: 'API', type: 'remote' }, - { - name: 'methods', - title: 'API请求方式', - type: 'static', - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ] - }, - { name: 'path', title: 'API路径', type: 'pattern', pattern: '' } - ] - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetApiGroupList = jest.spyOn(component, 'getApiGroupList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyGetApiGroupList).not.toHaveBeenCalled() - - component.filterForm.name = '' - component.filterNamesSet = new Set() - component.filterTypeMap = new Map() - component.filterNamesList = [] - component.filterType = '' - - component.getFilterNamesList() - fixture.detectChanges() - - expect(spyGetApiGroupList).toHaveBeenCalledTimes(1) - expect(component.filterForm).toStrictEqual({ - name: 'api', - title: 'API', - label: 'API', - value: 'api', - type: 'remote', - patternIsPass: true, - allChecked: false, - total: undefined, - values: [] - }) - expect(component.filterNamesList).toStrictEqual([ - { - allChecked: false, - name: 'api', - title: 'API', - label: 'API', - value: 'api', - type: 'remote', - patternIsPass: true, - total: undefined, - values: [] - }, - { - allChecked: false, - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - value: 'methods', - patternIsPass: true, - type: 'static', - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ], - total: 7, - values: [] - }, - { - allChecked: false, - name: 'path', - title: 'API路径', - label: 'API路径', - value: 'path', - type: 'pattern', - patternIsPass: true, - total: 0, - pattern: '', - values: [] - } - ]) - expect(component.filterTypeMap.get('api')).toStrictEqual({ - allChecked: false, - name: 'api', - title: 'API', - label: 'API', - value: 'api', - patternIsPass: true, - type: 'remote', - total: undefined, - values: [] - }) - expect(component.filterTypeMap.get('methods')).toStrictEqual({ - allChecked: false, - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - patternIsPass: true, - value: 'methods', - type: 'static', - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ], - total: 7, - values: [] - }) - expect(component.filterTypeMap.get('path')).toStrictEqual({ - allChecked: false, - name: 'path', - title: 'API路径', - label: 'API路径', - value: 'path', - patternIsPass: true, - type: 'pattern', - total: 0, - pattern: '', - values: [] - }) - expect(component.filterType).toStrictEqual('remote') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterForm.name = 'methods' - - component.getFilterNamesList() - - expect(component.filterForm).toStrictEqual({ - allChecked: false, - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - value: 'methods', - patternIsPass: true, - type: 'static', - showAll: true, - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ], - total: 7, - values: [] - }) - }) - - it('##getFilterNamesList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getFilterNamesList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getFilterNamesList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getFilterNamesList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - }) - - it('##getRemoteList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - target: 'test1', - titles: [ - { title: 'uuid', field: 'uuid' }, - { title: 'name', field: 'name' }, - { title: 'scheme', field: 'scheme' } - ], - test1: [ - { uuid: '111', name: 'name1', scheme: 'test1', desc: 'desc1' }, - { uuid: '222', name: 'name2', scheme: 'test2', desc: 'desc2' }, - { uuid: '333', name: 'name3', scheme: 'test3', desc: 'desc3' } - ], - total: 3 - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getRemoteList('api') - fixture.detectChanges() - expect(component.remoteSelectList).toStrictEqual([]) - expect(component.remoteSelectNameList).toStrictEqual([]) - expect(component.remoteList).toStrictEqual([ - { - uuid: '111', - key: '111', - checked: false, - title: 'name1', - direction: 'left', - name: 'name1', - scheme: 'test1', - desc: 'desc1' - }, - { - uuid: '222', - key: '222', - checked: false, - title: 'name2', - direction: 'left', - name: 'name2', - scheme: 'test2', - desc: 'desc2' - }, - { - uuid: '333', - key: '333', - checked: false, - title: 'name3', - direction: 'left', - name: 'name3', - scheme: 'test3', - desc: 'desc3' - } - ]) - expect(component.filterTbody).toStrictEqual([ - { - key: 'checked', - type: 'checkbox' - }, - { key: 'uuid' }, - { key: 'name' }, - { key: 'scheme' } - ]) - expect(component.filterThead).toStrictEqual([ - { - type: 'checkbox' - }, - { title: 'uuid' }, - { title: 'name' }, - { title: 'scheme' } - ]) - // expect(component.filterForm.total).toStrictEqual(3) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getRemoteList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getRemoteList('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getRemoteList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getRemoteList('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - }) - - it('##getApiGroupList with success return, transferHeader test', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - root: { - groups: [ - { - uuid: '123', - name: '123', - children: [ - { - uuid: '1231', - name: '1231', - children: [{ uuid: '12311', name: '12311' }] - }, - { - uuid: '1231', - name: '1231' - } - ] - }, - { uuid: '234', name: '234' }, - { - uuid: '345', - name: '345', - children: [ - { - uuid: '3451', - name: '3451' - } - ] - } - ] - } - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getApiGroupList() - fixture.detectChanges() - expect(component.apiGroupList).toStrictEqual([ - { - uuid: '123', - name: '123', - children: [ - { - uuid: '1231', - name: '1231', - children: [{ uuid: '12311', name: '12311', isLeaf: true }] - }, - { - uuid: '1231', - name: '1231', - isLeaf: true - } - ] - }, - { uuid: '234', name: '234', isLeaf: true }, - { - uuid: '345', - name: '345', - children: [ - { - uuid: '3451', - name: '3451', - isLeaf: true - } - ] - } - ]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getApiGroupList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getApiGroupList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getApiGroupList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getApiGroupList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - component.disabledEdit(false) - expect(component.nzDisabled).toStrictEqual(false) - })) - - it('##getSearchRemoteList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - target: 'test1', - titles: [ - { title: 'uuid', field: 'uuid' }, - { title: 'name', field: 'name' }, - { title: 'scheme', field: 'scheme' } - ], - test1: [ - { uuid: '111', name: 'name1', scheme: 'test1', desc: 'desc1' }, - { uuid: '222', name: 'name2', scheme: 'test2', desc: 'desc2' }, - { uuid: '333', name: 'name3', scheme: 'test3', desc: 'desc3' } - ], - total: 3 - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getSearchRemoteList() - fixture.detectChanges() - expect(component.remoteList).toStrictEqual([ - { - uuid: '111', - key: '111', - checked: false, - title: 'name1', - direction: 'left', - name: 'name1', - scheme: 'test1', - desc: 'desc1' - }, - { - uuid: '222', - key: '222', - checked: false, - title: 'name2', - direction: 'left', - name: 'name2', - scheme: 'test2', - desc: 'desc2' - }, - { - uuid: '333', - key: '333', - checked: false, - title: 'name3', - direction: 'left', - name: 'name3', - scheme: 'test3', - desc: 'desc3' - } - ]) - expect(component.filterForm.total).toStrictEqual(3) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getSearchRemoteList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getSearchRemoteList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getSearchRemoteList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getSearchRemoteList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('筛选失败!') - }) - - it('##changeFilterType test', () => { - component.filterTypeMap.set('api', { - name: 'api', - title: 'API', - label: 'API', - value: 'api', - type: 'remote', - options: undefined, - total: undefined, - allChecked: true, - values: [] - }) - component.filterTypeMap.set('methods', { - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - value: 'methods', - type: 'static', - allChecked: true, - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ], - total: 7, - values: [] - }) - component.filterTypeMap.set('path', { - name: 'path', - title: 'API路径', - label: 'API路径', - value: 'path', - type: 'pattern', - options: undefined, - total: undefined, - pattern: '1', - values: [] - }) - - const spyUpdateAllChecked = jest.spyOn(component, 'updateAllChecked') - const spyGetRemoteList = jest.spyOn(component, 'getRemoteList') - component.filterForm.allChecked = true - component.changeFilterType('methods') - - expect(component.filterType).toStrictEqual('static') - expect(component.filterForm).toStrictEqual({ - name: 'methods', - title: 'API请求方式', - label: 'API请求方式', - value: 'methods', - type: 'static', - allChecked: true, - options: [ - 'ALL', - 'POST', - 'PUT', - 'GET', - 'DELETE', - 'OPTION', - 'PATCH', - 'HEAD' - ], - total: 7, - showAll: true, - values: [] - }) - expect(component.staticsList).toStrictEqual([ - { label: 'POST', value: 'POST', checked: true }, - { label: 'PUT', value: 'PUT', checked: true }, - { label: 'GET', value: 'GET', checked: true }, - { label: 'DELETE', value: 'DELETE', checked: true }, - { label: 'OPTION', value: 'OPTION', checked: true }, - { label: 'PATCH', value: 'PATCH', checked: true }, - { label: 'HEAD', value: 'HEAD', checked: true } - ]) - expect(spyUpdateAllChecked).toHaveBeenCalledTimes(1) - expect(spyGetRemoteList).not.toBeCalled() - - component.changeFilterType('api') - fixture.detectChanges() - - expect(component.filterType).toStrictEqual('remote') - expect(component.filterForm).toStrictEqual({ - name: 'api', - title: 'API', - label: 'API', - value: 'api', - type: 'remote', - allChecked: true, - options: undefined, - total: undefined, - values: [] - }) - expect(spyUpdateAllChecked).toHaveBeenCalledTimes(1) - expect(spyGetRemoteList).toHaveBeenCalledTimes(1) - - component.changeFilterType('path') - - expect(component.filterType).toStrictEqual('pattern') - expect(component.filterForm).toStrictEqual({ - name: 'path', - title: 'API路径', - label: 'API路径', - value: 'path', - type: 'pattern', - options: undefined, - total: undefined, - pattern: /1/, - values: [] - }) - expect(component.filterForm.pattern).toStrictEqual(/1/) - expect(spyUpdateAllChecked).toHaveBeenCalledTimes(1) - expect(spyGetRemoteList).toHaveBeenCalledTimes(1) - }) - - it('##change test', fakeAsync(() => { - const ret: TransferChange = { - from: 'left', - to: 'right', - list: [ - { - uuid: '18a92926-8e01-9c75-897d-614d005c48de', - name: 'APITest1', - service: 'QQQQService', - group: '应用管理/上线管理', - requestPath: '2', - key: '18a92926-8e01-9c75-897d-614d005c48de', - checked: false, - title: 'APITest1', - direction: 'right', - hide: false - }, - { - uuid: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - name: '1', - service: 'test_baidu_service', - group: 'API管理/上线管理', - requestPath: '2', - key: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - checked: false, - title: '1', - direction: 'right', - hide: false - } - ] - } - - component.remoteList = [ - { - uuid: '18a92926-8e01-9c75-897d-614d005c48de', - name: 'APITest1', - service: 'QQQQService', - group: '应用管理/上线管理', - requestPath: '2', - key: '18a92926-8e01-9c75-897d-614d005c48de', - checked: false, - title: 'APITest1', - hide: false - }, - { - uuid: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - name: '1', - service: 'test_baidu_service', - group: 'API管理/上线管理', - requestPath: '2', - key: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - checked: false, - title: '1', - hide: false - }, - { - uuid: '111', - key: '111', - checked: false, - title: 'name1', - direction: 'left', - name: 'name1', - scheme: 'test1', - desc: 'desc1' - }, - { - uuid: '222', - key: '222', - checked: false, - title: 'name2', - direction: 'left', - name: 'name2', - scheme: 'test2', - desc: 'desc2' - }, - { - uuid: '333', - key: '333', - checked: false, - title: 'name3', - direction: 'left', - name: 'name3', - scheme: 'test3', - desc: 'desc3' - } - ] - - component.change(ret) - fixture.detectChanges() - tick(300) - expect(component.remoteSelectList).toStrictEqual([ - '18a92926-8e01-9c75-897d-614d005c48de', - '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3' - ]) - expect(component.remoteSelectNameList).toStrictEqual(['APITest1', '1']) - - const ret2: TransferChange = { - from: 'right', - to: 'left', - list: [ - { - uuid: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - name: '1', - service: 'test_baidu_service', - group: 'API管理/上线管理', - requestPath: '2', - key: '74f83c4b-2199-66c6-3e1c-fc5b5f4d54a3', - checked: false, - title: '1', - hide: false - } - ] - } - component.change(ret2) - fixture.detectChanges() - tick(300) - expect(component.remoteSelectList).toStrictEqual([ - '18a92926-8e01-9c75-897d-614d005c48de' - ]) - expect(component.remoteSelectNameList).toStrictEqual(['APITest1']) - })) - - it('##updateSingleChecked test', fakeAsync(() => { - component.staticsList = [ - { value: 'test1', checked: true }, - { value: 'test2', checked: true } - ] - component.updateSingleChecked() - fixture.detectChanges() - - expect(component.filterForm.allChecked).toStrictEqual(true) - expect(component.filterForm.values).toStrictEqual(['test1', 'test2']) - - component.staticsList = [ - { value: 'test1', checked: true }, - { value: 'test2', checked: false } - ] - component.updateSingleChecked() - fixture.detectChanges() - - expect(component.filterForm.allChecked).toStrictEqual(false) - expect(component.filterForm.values).toStrictEqual(['test1']) - - component.staticsList = [ - { value: 'test1', checked: false }, - { value: 'test2', checked: false } - ] - component.updateSingleChecked() - fixture.detectChanges() - - expect(component.filterForm.allChecked).toStrictEqual(false) - expect(component.filterForm.values).toStrictEqual([]) - })) - - it('checkPattern test', fakeAsync(() => { - component.filterForm.values = ['1'] - component.filterForm.pattern = /\w+/ - component.filterForm.patternIsPass = true - - component.checkPattern() - expect(component.filterForm.patternIsPass).toStrictEqual(true) - - component.filterForm.values = [' 1'] - component.checkPattern() - expect(component.filterForm.patternIsPass).toStrictEqual(true) - - component.filterForm.values = ['1'] - component.filterForm.pattern = /\W+/ - component.filterForm.patternIsPass = true - - component.checkPattern() - expect(component.filterForm.patternIsPass).toStrictEqual(false) - })) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/filter/table/table.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/filter/table/table.component.spec.ts deleted file mode 100644 index 2e37378eb..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/filter/table/table.component.spec.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { - ComponentFixture, - fakeAsync, - TestBed -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../../cache/create/create.component' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { TrafficCreateComponent } from '../../traffic/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { FilterTableComponent } from './table.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('FilterTableComponent test as editPage is false', () => { - let component: FilterTableComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [FilterTableComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FilterTableComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##click table btns', () => { - const spyOpenDrawer = jest.spyOn(component, 'openDrawer') - // @ts-ignore - const spyModalService = jest.spyOn(component.modalService, 'create') - expect(spyOpenDrawer).toHaveBeenCalledTimes(0) - expect(spyModalService).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.filterTableBody[2].btns[0].click(item) - expect(spyOpenDrawer).toHaveBeenCalledTimes(1) - expect(spyModalService).toHaveBeenCalledTimes(0) - - component.filterTableBody[2].btns[1].click(item) - expect(spyOpenDrawer).toHaveBeenCalledTimes(1) - expect(spyModalService).toHaveBeenCalledTimes(1) - - expect(component.filterTableBody[2].btns[0].disabledFn()).toStrictEqual(false) - expect(component.filterTableBody[2].btns[1].disabledFn()).toStrictEqual(false) - }) - - it('##filterTableClick test', fakeAsync(() => { - const spyOpenDrawer = jest.spyOn(component, 'openDrawer') - expect(spyOpenDrawer).not.toBeCalled() - - component.filterTableClick({ data: { value: ['ALL'] } }) - expect(spyOpenDrawer).toHaveBeenCalledTimes(1) - })) - - it('##filterDelete test', () => { - component.filterNamesSet = new Set(['test1', 'test2', 'test3']) - const deleteF: any = { name: 'test2', label: '2', title: '2', values: [] } - const filterList: any = [ - { name: 'test1', label: '1', title: '1', values: [] }, - deleteF, - { name: 'test3', label: '3', title: '3', values: [] }, - { name: 'test4', label: '4', title: '4', values: [] } - ] - component.filterShowList = filterList - component.filterDelete({ name: 'test' }) - expect(component.filterNamesSet).toStrictEqual( - new Set(['test1', 'test2', 'test3']) - ) - expect(component.filterShowList).toStrictEqual(filterList) - - component.filterShowList = filterList - component.filterDelete({ name: 'test1' }) - expect(component.filterNamesSet).toStrictEqual(new Set(['test2', 'test3'])) - expect(component.filterShowList).toStrictEqual(filterList) - - component.filterShowList = filterList - component.filterDelete(deleteF) - expect(component.filterNamesSet).toStrictEqual(new Set(['test3'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'test1', label: '1', title: '1', values: [] }, - { name: 'test3', label: '3', title: '3', values: [] }, - { name: 'test4', label: '4', title: '4', values: [] } - ]) - }) - - it('##openDrawer & cancelDrawer test', () => { - expect(component.drawerFilterRef).toBeUndefined() - component.openDrawer('addFilter') - fixture.detectChanges() - expect(component.drawerFilterRef).not.toBeUndefined() - component.drawerFilterRef = undefined - component.openDrawer('editFilter', { - name: 'static', - title: 'API请求方式', - label: 'API请求方式', - total: 3, - values: ['ALL'] - }) - fixture.detectChanges() - expect(component.drawerFilterRef).not.toBeUndefined() - expect(component.filterForm).toStrictEqual({ - name: 'static', - title: 'API请求方式', - label: 'API请求方式', - total: 3, - allChecked: true, - values: ['ALL'] - }) - }) - - it('##openDrawer & cancelDrawer test', () => { - expect(component.drawerFilterRef).toBeUndefined() - component.openDrawer('addFilter') - fixture.detectChanges() - expect(component.drawerFilterRef).not.toBeUndefined() - component.drawerFilterRef = undefined - component.openDrawer('editFilter', { - name: 'ip', - title: 'API请求方式', - label: 'API请求方式', - total: 3, - values: ['ttttt', 'eeeeeee', 'ssssssss', 'ttttttt'] - }) - fixture.detectChanges() - expect(component.drawerFilterRef).not.toBeUndefined() - expect(component.filterForm).toStrictEqual({ - name: 'ip', - title: 'API请求方式', - label: 'API请求方式', - total: 3, - values: ['ttttt\neeeeeee\nssssssss\nttttttt'] - }) - expect(component.editFilter).toStrictEqual({ - name: 'ip', - title: 'API请求方式', - label: 'API请求方式', - total: 3, - values: ['ttttt\neeeeeee\nssssssss\nttttttt'] - }) - - // @ts-ignore - component.drawerFilterRef.close = () => { - return 'drawer is close' - } - // @ts-ignore - const spyFn = jest.spyOn(component.drawerFilterRef, 'close') - expect(spyFn).not.toHaveBeenCalled() - component.drawerClose(false) - expect(spyFn).not.toHaveBeenCalled() - - component.drawerClose(true) - expect(spyFn).toHaveBeenCalledTimes(1) - }) - - it('##cleanFilterForm test', fakeAsync(() => { - component.filterForm = { - name: 'test', - title: '', - values: ['1'], - label: '', - text: 'test', - allChecked: false, - showAll: false, - total: 0, - groupUuid: 'test', - pattern: null, - patternIsPass: false - } - component.editFilter = { test: 'test' } - component.remoteSelectList = ['2'] - component.remoteSelectNameList = ['test2'] - component.staticsList = ['test2'] - - component.cleanFilterForm() - - expect(component.filterForm).toStrictEqual( - { - name: '', - title: '', - values: [], - label: '', - text: '', - allChecked: false, - showAll: false, - total: 0, - groupUuid: '', - pattern: null, - patternIsPass: true - } - ) - expect(component.editFilter).toStrictEqual(null) - expect(component.remoteSelectList).toStrictEqual([]) - expect(component.remoteSelectNameList).toStrictEqual([]) - expect(component.staticsList).toStrictEqual([]) - })) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/fuse/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/fuse/create/create.component.spec.ts deleted file mode 100644 index cb53311a3..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/fuse/create/create.component.spec.ts +++ /dev/null @@ -1,947 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../../cache/create/create.component' -import { FuseCreateComponent } from './create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('FuseCreateComponent test as editPage is false', () => { - let component: FuseCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [FuseCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2', strategy_uuid: 'uuid' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FuseCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - }) - - it('##ngOnChanges test', () => { - component.strategyUuid = '' - component.createStrategyForm.uuid = '1' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('1') - - component.strategyUuid = '123' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('123') - }) - - it('##getStrategyMessage with success return (without optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const mockValue1: any = { - code: 0, - data: { - strategy: { - name: 'test', - uuid: '1111', - desc: 'testdescc', - priority: 2, - filters: [ - { - name: 'ip', - values: ['111.111.111.111', '111.111.111.112'], - type: 'pattern', - label: '111.111.111.111,111.111.111.112', - title: 'IP' - } - ], - config: { - metric: 'service', - fuseCondition: { - statusCodes: [300, 400], - count: '' - }, - fuseTime: { - time: '', - maxTime: '' - }, - recoverCondition: { - statusCodes: [100, 200], - count: '' - }, - response: { - statusCode: 999, - contentType: 'application/json', - charset: 'UTF-8', - header: [ - { - key: '1', - value: '2' - } - ], - body: 'body~' - } - } - } - } - } - - const expectCreateStrategyForm: any = { - name: 'test', - uuid: '1111', - desc: 'testdescc', - priority: 2, - filters: [ - { - name: 'ip', - values: ['111.111.111.111', '111.111.111.112'], - type: 'pattern', - label: '111.111.111.111,111.111.111.112', - title: 'IP' - } - ], - config: { - metric: 'service', - fuseCondition: { - statusCodes: [300, 400], - count: '' - }, - fuseTime: { - time: '', - maxTime: '' - }, - recoverCondition: { - statusCodes: [100, 200], - count: '' - }, - response: { - statusCode: 999, - contentType: 'application/json', - charset: 'UTF-8', - header: [ - { - key: '1', - value: '2' - } - ], - body: 'body~' - } - } - } - - const expValidateForm: any = { - name: 'test', - desc: 'testdescc', - priority: 2, - configFuseCount: 3, - configFuseTime: 2, - configFuseMaxTime: 300, - configRecoverCount: 3 - } - - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue1)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - - expect(component.createStrategyForm).toStrictEqual(expectCreateStrategyForm) - expect(component.validateForm.value).toStrictEqual(expValidateForm) - expect(component.filterNamesSet).toStrictEqual(new Set(['ip'])) - expect(component.filterShowList).toStrictEqual([ - { - label: '111.111.111.111,111.111.111.112', - name: 'ip', - title: 'IP', - type: 'pattern', - values: ['111.111.111.111', '111.111.111.112'] - } - ]) - expect(component.responseHeaderList).toStrictEqual([ - { key: '1', value: '2' } - ]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 999, - contentType: 'application/json', - charset: 'UTF-8', - header: null, - body: 'body~' - }) - - expect(component.responseForm.value).toStrictEqual({ - body: 'body~', - charset: 'UTF-8', - contentType: 'application/json', - header: null, - statusCode: 999 - }) - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategyMessage with success return (with null response)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - config: { - metrics: [], - response: { - statusCode: '', - contentType: '', - charset: '', - body: '' - } - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(component.responseHeaderList).toStrictEqual([{ key: '', value: '' }]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 200, - contentType: 'application/json', - charset: 'UTF-8', - header: null, - body: '' - }) - expect(component.responseForm.controls['contentType'].value).toStrictEqual( - 'application/json' - ) - expect(component.responseForm.controls['charset'].value).toStrictEqual( - 'UTF-8' - ) - expect(component.responseForm.controls['body'].value).toStrictEqual('') - }) - - it('##getStrategyMessage with success return (with optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - metric: '{service}', - fuseCondition: { statusCodes: [100, 200], count: 3 }, - fuseTime: { time: 5, maxTime: 5 }, - recoverCondition: { statusCodes: [300, 400], count: 3 }, - response: { - statusCode: '', - contentType: '', - charset: '', - header: [], - body: '' - } - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(component.createStrategyForm).toStrictEqual({ - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - metric: '{service}', - fuseCondition: { statusCodes: [100, 200], count: 3 }, - fuseTime: { time: 5, maxTime: 5 }, - recoverCondition: { statusCodes: [300, 400], count: 3 }, - response: { - statusCode: '', - contentType: '', - charset: '', - header: [], - body: '' - } - } - }) - expect(component.filterNamesSet).toStrictEqual(new Set(['testF'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'testF', uuid: '123' } - ]) - expect(spyService).toHaveBeenCalled() - expect(component.responseHeaderList).toStrictEqual([{ key: '', value: '' }]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 200, - contentType: 'application/json', - charset: 'UTF-8', - header: null, - body: '' - }) - expect(component.responseForm.controls['contentType'].value).toStrictEqual( - 'application/json' - ) - expect(component.responseForm.controls['charset'].value).toStrictEqual( - 'UTF-8' - ) - expect(component.responseForm.controls['body'].value).toStrictEqual('') - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - })) - - it('## saveStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyBackToList = jest.spyOn(component, 'backToList') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - component.filterShowList = [ - { title: 'test1', label: 'test1', name: 'test1', values: [''] }, - { title: 'test2', label: 'test2', name: 'test2', values: [''] }, - { title: 'test3', label: 'test3', name: 'test3', values: [] } - ] - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [1] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - component.responseHeaderList = [ - { - key: '1', - value: '2' - }, - { - key: '1', - value: '' - }, - { - key: '', - value: '2' - } - ] - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(null) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(null) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(null) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(null) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(null) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2002) - component.responseForm.controls['contentType'].setValue('application/json') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(2) - component.responseForm.controls['contentType'].setValue('') - component.responseForm.controls['charset'].setValue('UTF-8') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(200) - component.responseForm.controls['contentType'].setValue('test') - component.responseForm.controls['charset'].setValue('') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.responseForm.controls['charset'].setValue('test') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component.createStrategyForm.filters).toStrictEqual([ - { name: 'test1', values: [''] }, - { name: 'test2', values: [''] }, - { name: 'test3', values: [] } - ]) - expect(component.createStrategyForm.config.response.header).toStrictEqual([ - { key: '1', value: '2' } - ]) - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyBackToList).toHaveBeenCalledTimes(2) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##saveStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: -1, data: {} })) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.fuseCondition.statusCodes = [110, 112] - component.createStrategyForm.config.recoverCondition.statusCodes = [100] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['configFuseCount'].setValue(2) - component.validateForm.controls['configFuseTime'].setValue(2) - component.validateForm.controls['configFuseMaxTime'].setValue(2) - component.validateForm.controls['configRecoverCount'].setValue(2) - component.responseForm.controls['statusCode'].setValue(200) - component.responseForm.controls['contentType'].setValue('test') - component.responseForm.controls['charset'].setValue('test') - component.responseForm.controls['header'].setValue('') - component.responseForm.controls['body'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('创建失败!') - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('修改失败!') - }) - - it('##backToList test', fakeAsync(() => { - // @ts-ignore - const spyBack = jest.spyOn(component.location, 'back') - expect(spyBack).not.toHaveBeenCalled() - - component.backToList() - tick(100) - expect(spyBack).toHaveBeenCalled() - })) -}) - -describe('FuseCreateComponent test as editPage is false', () => { - let component: FuseCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [FuseCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FuseCreateComponent) - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/fuse/fuse.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/fuse/fuse.component.test.ts deleted file mode 100644 index 093f05f9b..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/fuse/fuse.component.test.ts +++ /dev/null @@ -1,438 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('服务治理-熔断策略 e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - await page.locator('button:has-text("登录")').click() - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - - await page.locator('eo-ng-menu-default div:has-text("服务治理")').click() - await page.getByRole('link', { name: '熔断策略' }).click() - }) - - it('保存按钮为primary,未添加数据时,点击保存按钮将出现错误提示 ', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-form-item-explain-error >> nth = 0').click() - }) - - it('添加条件按钮为primary,点击后出现弹窗,配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.locator('eo-ng-select#name').last().click() - - await page.locator('text=API').nth(1).click() - await page.waitForTimeout(200) - - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - const transferBtn1 = await page.locator('.ant-transfer-operation button >> nth =0') - let transferBtn1Disabled = await transferBtn1.isDisabled() - - const transferBtn2 = await page.locator('.ant-transfer-operation button >> nth =1') - const transferBtn2Disabled = await transferBtn2.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await expect(transferBtn2Disabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').click() - await page.locator('input[type="checkbox"] >> nth=2').click() - transferBtn1Disabled = await transferBtn1.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(false) - - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - }) - - // it('在搜索框内输入搜索内容, 页面选项将发生变化, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - // - // await page.locator('button:has-text("添加条件")').click() - // await page.locator('eo-ng-select#name').click() - - // await page.locator('text=应用').nth(1).click() - // await page.waitForTimeout(100) - - // await page.locator(' [placeholder="请输入搜索内容"] >> nth = 1').fill('test') - // await expect(await page.locator('text=匿名应用').isVisible()).toStrictEqual(false) - // }) - - it('属性名称选择API路径时, 输入框未有值时, 保存按钮置灰, 输入值不符合正则时,保存按钮置灰,反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.locator('eo-ng-select#name').last().click() - await page.waitForTimeout(400) - await page.locator('text=API路径').click() - let tableLength = await (await page.$$('eo-ng-filter-table tr')).length - expect(tableLength).toStrictEqual(2) - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('11 11') - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - tableLength = await (await page.$$('eo-ng-filter-table tr')).length - expect(tableLength).toStrictEqual(3) - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - const saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.getByText('API请求方式').click() - await page.getByLabel('ALL').check() - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - await expect(await page.locator('eo-ng-filter-table tbody tr td:has-text("所有API请求方式")').isVisible()).toStrictEqual(true) - }) - it('点击添加条件按钮, 点击取消时, 弹窗消失, 列表行数不变', async () => { - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - await page.locator('button:has-text("添加条件")').click() - await page.waitForTimeout(400) - await page.locator('eo-ng-filter-footer .ml-btnbase').last().click() - - await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - }) - - // it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.getByRole('cell', { name: 'API' }).click() - // // await page.locator('eo-ng-filter-table tbody tr >> nth = 0 >> td >> nth =2 >> button >> nth = 0').first().click() - // await page.waitForTimeout(2000) - - // await page.locator('input[type="checkbox"] >> nth=0').click() - // await page.locator('.ant-transfer-operation button >> nth =1').click() - // await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - - // await page.locator('.icon-shanchu >> nth = 2').click() - // await page.locator('.nz-modal-footer button:has-text("取消")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - - // await page.locator('.icon-shanchu >> nth = 1').click() - // await page.locator('.nz-modal-footer button:has-text("确定")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - // }) - - // it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // await page.locator('.icon-a-peizhianniu_huaban1 >> nth = 1').click() - // await page.getByLabel('DELETE').uncheck() - // await page.getByLabel('ALL').check() - // // Click button:has-text("保存") - // await page.locator('eo-ng-filter-footer .ant-btn-primary:has-text("提交")').click() - // }) - - // it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('[placeholder="请输入API路径"]').fill('test1') - // await page.locator('eo-ng-filter-footer button:has-text("提交")').click() - // await page.getByRole('cell', { name: 'test1' }).click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - // }) - - it('点击添加条件,选择ip地址,当输入的不符合正则时,出现错误提示且无法提交', async () => { - await page.getByRole('button', { name: '添加条件' }).click() - await page.locator('eo-ng-select#name').last().click() - await page.getByText('IP').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111') - await page.getByText('输入的IP或CIDR不符合格式').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111.111.111') - await page.locator('eo-ng-filter-footer:has-text("保存 取消")').getByRole('button', { name: '保存' }).click() - }) - - it('清空所有必输项,点击保存,页面不变;逐一填写必输项,直至填写完毕,点击保存,页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - await page.getByRole('spinbutton').first().click() - await page.getByRole('spinbutton').first().fill('') - await page.locator('eo-ng-input-group').getByPlaceholder('请输入').fill('') - await page.locator('eo-ng-input-group').getByPlaceholder('请输入').click() - await page.getByRole('spinbutton').nth(2).click() - await page.getByRole('spinbutton').nth(2).fill('') - await page.getByRole('spinbutton').nth(3).click() - await page.getByRole('spinbutton').nth(3).fill('') - await page.locator('eo-ng-response-form').getByRole('spinbutton').click() - await page.locator('eo-ng-response-form').getByRole('spinbutton').fill('') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-select-clear svg').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-form-item').filter({ hasText: '策略名称必填项' }).getByRole('alert').click() - await page.locator('.ant-form-item-explain >> nth = 1').click() - await page.locator('.ant-form-item-explain >> nth = 2').click() - await page.locator('.ant-form-item-explain >> nth = 3').click() - await page.locator('.ant-form-item-explain >> nth = 4').click() - await page.locator('eo-ng-response-form nz-form-item').filter({ hasText: '*HTTP状态码必填项' }).getByRole('alert').click() - await page.locator('eo-ng-response-form nz-form-control').filter({ hasText: '请选择 必填项' }).getByRole('alert').click() - - await page.getByPlaceholder('请输入首字母为英文,英文数字下划线任意一种组合').click() - await page.getByPlaceholder('请输入首字母为英文,英文数字下划线任意一种组合').fill('testForE2e') - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('spinbutton').first().click() - await page.getByRole('spinbutton').first().fill('1') - await page.locator('eo-ng-input-group').getByPlaceholder('请输入').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-input-group').getByPlaceholder('请输入').click() - await page.locator('eo-ng-input-group').getByPlaceholder('请输入').fill('2') - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('spinbutton').nth(2).click() - await page.getByRole('spinbutton').nth(2).fill('3') - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('spinbutton').nth(3).fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-response-form').getByRole('spinbutton').click() - await page.locator('eo-ng-response-form').getByRole('spinbutton').fill('100') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-select-top-control').filter({ hasText: '请选择' }).click() - await page.locator('eo-ng-option-item').filter({ hasText: 'application/json' }).click() - await page.getByText('UTF-8').click() - await page.getByText('GBK').click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('success').click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - await page.getByRole('cell', { name: 'testForE2e' }).last().click() - await page.getByText('熔断策略 / testForE2e /').click() - await page.getByRole('button', { name: '提交' }).click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - const priorityInput = await page.locator('input#priority') - const priorityInputW = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const priorityInputH = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(priorityInputW).toStrictEqual('346px') - await expect(priorityInputH).toStrictEqual('32px') - - const metricInput = await page.locator('eo-ng-select#metric') - const metricInputW = await metricInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const metricInputnH = await metricInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(metricInputW).toStrictEqual('346px') - await expect(metricInputnH).toStrictEqual('32px') - - const failedHttpInput = await page.getByText('500[object Text]') - const failedHttpInputW = await failedHttpInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const failedHttpInputH = await failedHttpInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(failedHttpInputW).toStrictEqual('346px') - await expect(failedHttpInputH).toStrictEqual('32px') - - const failedCountInput = await page.getByRole('spinbutton').first() - const failedCountInputW = await failedCountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const failedCountInputH = await failedCountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(failedCountInputW).toStrictEqual('346px') - await expect(failedCountInputH).toStrictEqual('32px') - - const fuseLastTimeInput = await page.locator('eo-ng-input-group') - const fuseLastTimeInputW = await fuseLastTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const fuseLastTimeInputH = await fuseLastTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(fuseLastTimeInputW).toStrictEqual('346px') - await expect(fuseLastTimeInputH).toStrictEqual('32px') - - const fuseMaxLastTimeInput = await page.getByRole('spinbutton').nth(2) - const fuseMaxLastTimeInputW = await fuseMaxLastTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const fuseMaxLastTimeInputH = await fuseMaxLastTimeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(fuseMaxLastTimeInputW).toStrictEqual('346px') - await expect(fuseMaxLastTimeInputH).toStrictEqual('32px') - - const succeedHttpInput = await page.getByText('200[object Text]') - const succeedHttpInputW = await succeedHttpInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const succeedHttpInputH = await succeedHttpInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(succeedHttpInputW).toStrictEqual('346px') - await expect(succeedHttpInputH).toStrictEqual('32px') - - const succeedCountInput = await page.getByRole('spinbutton').nth(3) - const succeedCountInputW = await succeedCountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const succeedCountInputH = await succeedCountInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(succeedCountInputW).toStrictEqual('346px') - await expect(succeedCountInputH).toStrictEqual('32px') - - const httpStatusInput = await page.locator('eo-ng-response-form').getByRole('spinbutton') - const httpStatusInputW = await httpStatusInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const httpStatusInputH = await httpStatusInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(httpStatusInputW).toStrictEqual('346px') - await expect(httpStatusInputH).toStrictEqual('32px') - - const contentTypeInput = await page.locator('eo-ng-select-top-control').filter({ hasText: 'application/json' }) - const contentTypeInputW = await contentTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const contentTypeInputH = await contentTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(contentTypeInputW).toStrictEqual('346px') - await expect(contentTypeInputH).toStrictEqual('32px') - - const charsetInput = await page.locator('eo-ng-select-top-control').filter({ hasText: 'UTF-8' }) - const charsetInputW = await charsetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const charsetInputH = await charsetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(charsetInputW).toStrictEqual('346px') - await expect(charsetInputH).toStrictEqual('32px') - - const headerFirstInput1 = await page.getByRole('cell', { name: '请输入Key' }) - const headerFirstInput1W = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1H = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1W).toStrictEqual('182px') - await expect(headerFirstInput1PR).toStrictEqual('8px') - await expect(headerFirstInput1H).toStrictEqual('32px') - - const headerFirstInput2 = await page.getByRole('cell', { name: '请输入Value' }) - const headerFirstInput2W = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput2PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput2H = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput2W).toStrictEqual('172px') - await expect(headerFirstInput2PR).toStrictEqual('8px') - await expect(headerFirstInput2H).toStrictEqual('32px') - - const headerFirstBtn = await page.getByRole('row', { name: '请输入Key 请输入Value ' }).getByRole('button', { name: '' }) - const headerFirstBtnH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerFirstBtnLH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerFirstBtnColor = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerFirstBtnH).toStrictEqual('32px') - await expect(headerFirstBtnLH).toStrictEqual('32px') - await expect(headerFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - await page.getByRole('button', { name: '' }).click() - - const headerFirstInput1A = await page.locator('eo-ng-apinto-table.arrayItem tr >> nth = 1 >> td >> nth = 0') - const headerFirstInput1AW = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1APR = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1APB = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - const headerFirstInput1AH = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1AW).toStrictEqual('182px') - await expect(headerFirstInput1APR).toStrictEqual('8px') - await expect(headerFirstInput1APB).toStrictEqual('12px') - await expect(headerFirstInput1AH).toStrictEqual('44px') - - const headerSecondBtn = await page.locator('eo-ng-apinto-table.arrayItem tr >> nth = 2 >> td >> nth = 2 >> button >> nth = 0') - const headerSecondBtnH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerSecondBtnLH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerSecondBtnColor = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerSecondBtnH).toStrictEqual('32px') - await expect(headerSecondBtnLH).toStrictEqual('32px') - await expect(headerSecondBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const bodyInput = await page.locator('eo-ng-response-form nz-form-item').filter({ hasText: 'Body' }).getByPlaceholder('请输入') - const bodyInputW = await bodyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const bodyInputH = await bodyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(bodyInputW).toStrictEqual('346px') - await expect(bodyInputH).toStrictEqual('32px') - - const limitSection1 = await page.locator('section.limit-bg >> nth = 0') - const limitSection1BG = await limitSection1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const limitSection1P = await limitSection1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - await expect(limitSection1BG).toStrictEqual('rgb(248, 248, 250)') - await expect(limitSection1P).toStrictEqual('20px') - - const limitSection2 = await page.locator('section.limit-bg >> nth = 1') - const limitSection2BG = await limitSection2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const limitSection2P = await limitSection2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - await expect(limitSection2BG).toStrictEqual('rgb(248, 248, 250)') - await expect(limitSection2P).toStrictEqual('20px') - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/grey/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/grey/create/create.component.spec.ts deleted file mode 100644 index ca7f295fa..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/grey/create/create.component.spec.ts +++ /dev/null @@ -1,669 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { GreyCreateComponent } from './create.component' -import { EoNgSwitchModule } from 'eo-ng-switch' -import { EoNgRadioModule } from 'eo-ng-radio' -import { NzSliderModule } from 'ng-zorro-antd/slider' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('GreyCreateComponent test as editPage is false', () => { - let component: GreyCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - EoNgSwitchModule, - EoNgRadioModule, - NzSliderModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: GreyCreateComponent - } - ]) - ], - declarations: [GreyCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2', strategy_uuid: 'uuid' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(GreyCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - }) - - it('##ngOnChanges test', () => { - component.strategyUuid = '' - component.createStrategyForm.uuid = '1' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('1') - - component.strategyUuid = '123' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('123') - }) - - it('##nodesTableBody test', fakeAsync(() => { - component.showNodesValid = true - expect(component.nodesTableBody[0].check({ test: 'test' })).toStrictEqual(true) - component.nodesTableBody[0].change() - expect(component.showNodesValid).toStrictEqual(false) - component.nzDisabled = true - expect(component.nodesTableBody[0].disabledFn()).toStrictEqual(true) - component.nzDisabled = false - expect(component.nodesTableBody[0].disabledFn()).toStrictEqual(false) - expect(component.nodesTableBody[1].btns[0].disabledFn()).toStrictEqual(false) - expect(component.nodesTableBody[2].btns[0].disabledFn()).toStrictEqual(false) - expect(component.nodesTableBody[2].btns[1].disabledFn()).toStrictEqual(false) - - component.nzDisabled = true - expect(component.nodesTableBody[0].disabledFn()).toStrictEqual(true) - expect(component.nodesTableBody[1].btns[0].disabledFn()).toStrictEqual(true) - expect(component.nodesTableBody[2].btns[0].disabledFn()).toStrictEqual(true) - expect(component.nodesTableBody[2].btns[1].disabledFn()).toStrictEqual(true) - })) - - it('##drawerTipShowFn test', fakeAsync(() => { - component.filterNamesSet = new Set() - expect(component.drawerTipShowFn()).toStrictEqual(true) - - component.filterNamesSet.add('application') - expect(component.drawerTipShowFn()).toStrictEqual(true) - - component.filterNamesSet.add('api') - expect(component.drawerTipShowFn()).toStrictEqual(false) - - component.filterNamesSet.add('service') - expect(component.drawerTipShowFn()).toStrictEqual(false) - - component.filterNamesSet.add('api') - expect(component.drawerTipShowFn()).toStrictEqual(false) - })) - - it('##getStrategyMessage with success return (without optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const mockValue1: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - config: { - nodes: [null] - } - } - } - } - - const expectCreateStrategyForm: any = { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - filters: [], - config: { - match: [], - nodes: [null] - } - } - - const expValidateForm: any = { - name: 'default_value', - desc: 'default_value', - priority: null, - keepSession: false, - distribution: 'percent', - percent1: 1, - percent2: 99 - - } - - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue1)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - - expect(component.createStrategyForm).toStrictEqual(expectCreateStrategyForm) - expect(component.validateForm.value).toStrictEqual(expValidateForm) - expect(component.filterNamesSet).toStrictEqual(new Set()) - expect(component.filterShowList).toStrictEqual([]) - expect(component.nodesList).toStrictEqual([{ node: '' }]) - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategyMessage with success return (with optional attr - percent)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - keepSession: false, - nodes: ['node1', 'node2'], - distribution: 'percent', - match: [], - percent: 12 - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(component.createStrategyForm).toStrictEqual({ - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - keepSession: false, - nodes: ['node1', 'node2'], - distribution: 'percent', - match: [], - percent: 12 - } - }) - expect(component.filterNamesSet).toStrictEqual(new Set(['testF'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'testF', uuid: '123' } - ]) - expect(component.nodesList).toStrictEqual([ - { node: 'node1' }, { node: 'node2' } - ]) - expect(spyService).toHaveBeenCalled() - expect(component.validateForm.controls['percent1'].value).toStrictEqual(0.12) - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - })) - - it('##checkNodesList', fakeAsync(() => { - component.showNodesValid = false - component.nodesList = [] - component.checkNodesList() - expect(component.showNodesValid).toStrictEqual(true) - - component.nodesList = [{ node: '2' }, { node: '' }] - component.checkNodesList() - expect(component.showNodesValid).toStrictEqual(false) - - component.nodesList = [{ node: '' }, { node: '' }] - component.checkNodesList() - expect(component.showNodesValid).toStrictEqual(true) - - component.nodesList = [{ node: '' }, { node: '2' }] - component.checkNodesList() - expect(component.showNodesValid).toStrictEqual(false) - })) - - it('##saveStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyBackToList = jest.spyOn(component, 'backToList') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - component.filterShowList = [{ title: 'test1', label: 'test1', name: 'test1', values: [''] }, { title: 'test2', label: 'test2', name: 'test2', values: [''] }, { title: 'test3', label: 'test3', name: 'test3', values: [] }] - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(2222) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue('percent') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('123t') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue('percent') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue('percent') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test1_') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['keepSession'].setValue(null) - component.validateForm.controls['distribution'].setValue('percent') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test1_1') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue(null) - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test__') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue('percent') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - component.nodesList = [{ node: 'test' }] - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).toBeCalledWith('创建成功!') - - expect(component.createStrategyForm.filters).toStrictEqual([ - { name: 'test1', values: [''] }, - { name: 'test2', values: [''] }, - { name: 'test3', values: [] } - ]) - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyBackToList).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##saveStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: -1, data: {} })) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test__') - component.validateForm.controls['priority'].setValue(null) - component.validateForm.controls['keepSession'].setValue(false) - component.validateForm.controls['distribution'].setValue('match') - component.validateForm.controls['percent1'].setValue(1) - component.validateForm.controls['percent2'].setValue(99) - component.nodesList = [{ node: 'test' }] - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('创建失败!') - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) - - it('##backToList test', fakeAsync(() => { - // @ts-ignore - const spyBack = jest.spyOn(component.location, 'back') - expect(spyBack).not.toHaveBeenCalled() - - component.backToList() - tick(100) - expect(spyBack).toHaveBeenCalled() - })) - - it('##backToList test', fakeAsync(() => { - component.validateForm.controls['percent1'].setValue(2) - component.changePercent(103, 'percent1') - expect(component.validateForm.controls['percent1'].value).toStrictEqual(100) - expect(component.validateForm.controls['percent2'].value).toStrictEqual(0) - - component.changePercent(-2, 'percent2') - expect(component.validateForm.controls['percent1'].value).toStrictEqual(100) - expect(component.validateForm.controls['percent2'].value).toStrictEqual(0) - - component.changePercent(23, 'percent1') - expect(component.validateForm.controls['percent1'].value).toStrictEqual(23) - expect(component.validateForm.controls['percent2'].value).toStrictEqual(77) - - component.changePercent(28, 'percent2') - expect(component.validateForm.controls['percent1'].value).toStrictEqual(72) - expect(component.validateForm.controls['percent2'].value).toStrictEqual(28) - })) -}) - -describe('GreyCreateComponent test as editPage is false', () => { - let component: GreyCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSwitchModule, - EoNgRadioModule, - NzSliderModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: GreyCreateComponent - } - ]) - ], - declarations: [GreyCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(GreyCreateComponent) - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/grey/grey.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/grey/grey.component.test.ts deleted file mode 100644 index 8e599609c..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/grey/grey.component.test.ts +++ /dev/null @@ -1,396 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('服务治理-灰度策略 e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - await page.locator('button:has-text("登录")').click() - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - - await page.locator('eo-ng-menu-default div:has-text("服务治理")').click() - await page.getByRole('link', { name: '灰度策略' }).click() - }) - - it('保存按钮为primary,未添加数据时,点击保存按钮将出现错误提示 ', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-form-item-explain-error >> nth = 0').click() - }) - - it('添加条件按钮为primary,点击后出现弹窗,配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.locator('eo-ng-select#name').last().click() - - await page.locator('text=API').nth(1).click() - await page.waitForTimeout(200) - - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - const transferBtn1 = await page.locator('.ant-transfer-operation button >> nth =0') - let transferBtn1Disabled = await transferBtn1.isDisabled() - - const transferBtn2 = await page.locator('.ant-transfer-operation button >> nth =1') - const transferBtn2Disabled = await transferBtn2.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await expect(transferBtn2Disabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').click() - await page.locator('input[type="checkbox"] >> nth=2').click() - transferBtn1Disabled = await transferBtn1.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(false) - - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - }) - - // it('在搜索框内输入搜索内容, 页面选项将发生变化, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - // - // await page.locator('button:has-text("添加条件")').click() - // await page.locator('eo-ng-select#name').click() - - // await page.locator('text=应用').nth(1).click() - // await page.waitForTimeout(100) - - // await page.locator(' [placeholder="请输入搜索内容"] >> nth = 1').fill('test') - // await expect(await page.locator('text=匿名应用').isVisible()).toStrictEqual(false) - // }) - - it('属性名称选择API路径时, 输入框未有值时, 保存按钮置灰, 输入值不符合正则时,保存按钮置灰,反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.getByLabel('按规则').click() - await page.locator('button:has-text("添加条件")').last().click() - await page.locator('eo-ng-select#name').last().click() - await page.waitForTimeout(400) - await page.locator('text=API路径').click() - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('11 11') - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - expect(await (await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength + 1) - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - const saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.getByText('API请求方式').click() - await page.getByLabel('ALL').check() - await page.locator('eo-ng-filter-footer >> nth = 0 >>.ant-btn-primary').click() - await expect(await page.locator('eo-ng-filter-table >> nth = 0 >> tbody tr td:has-text("所有API请求方式")').isVisible()).toStrictEqual(true) - }) - it('点击添加条件按钮, 之前选择过的属性不会出现在列表中 点击取消时, 弹窗消失, 列表行数不变', async () => { - const tableLength = await (await page.$$('eo-ng-filter-table >> nth = 1 >> tr')).length - - await page.locator('button:has-text("添加条件")').last().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API请求方式")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API")').isVisible()).toStrictEqual(false) - await page.locator('eo-ng-filter-footer .ml-btnbase').last().click() - - await expect((await page.$$('eo-ng-filter-table >> nth = 1 >> tr')).length).toStrictEqual(tableLength) - }) - - // it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.getByRole('cell', { name: 'API' }).click() - // // await page.locator('eo-ng-filter-table tbody tr >> nth = 0 >> td >> nth =2 >> button >> nth = 0').first().click() - // await page.waitForTimeout(2000) - - // await page.locator('input[type="checkbox"] >> nth=0').click() - // await page.locator('.ant-transfer-operation button >> nth =1').click() - // await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - - // await page.locator('.icon-shanchu >> nth = 2').click() - // await page.locator('.nz-modal-footer button:has-text("取消")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - - // await page.locator('.icon-shanchu >> nth = 1').click() - // await page.locator('.nz-modal-footer button:has-text("确定")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - // }) - - // it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // await page.locator('.icon-a-peizhianniu_huaban1 >> nth = 1').click() - // await page.getByLabel('DELETE').uncheck() - // await page.getByLabel('ALL').check() - // // Click button:has-text("保存") - // await page.locator('eo-ng-filter-footer .ant-btn-primary:has-text("提交")').click() - // }) - - // it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('[placeholder="请输入API路径"]').fill('test1') - // await page.locator('eo-ng-filter-footer button:has-text("提交")').click() - // await page.getByRole('cell', { name: 'test1' }).click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - // }) - - it('点击添加条件,选择ip地址,当输入的不符合正则时,出现错误提示且无法提交', async () => { - await page.getByRole('button', { name: '添加条件' }).first().click() - await page.locator('eo-ng-select#name').last().click() - await page.getByText('IP').last().click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111') - await page.getByText('输入的IP或CIDR不符合格式').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').nth(0).fill('111.111.111.111') - await page.locator('eo-ng-filter-footer:has-text("保存 取消")').getByRole('button', { name: '保存' }).click() - }) - - it('填写所有必填项,点击保存,页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.getByText('必填项').first().click() - await page.locator('section').getByRole('alert').click() - await page.getByPlaceholder('请输入首字母为英文,英文数字下划线任意一种组合').fill('testForE2e') - - await page.locator('#desc').click() - await page.locator('#desc').fill('desc') - await page.getByRole('button', { name: '否' }).click() - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('请输入主机名或IP:端口').click() - await page.getByPlaceholder('请输入主机名或IP:端口').fill('111') - await page.getByRole('cell', { name: '请输入主机名或IP:端口 请输入主机名或IP:端口' }).getByText('请输入主机名或IP:端口').click() - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - - await page.getByPlaceholder('请输入主机名或IP:端口').nth(0).fill('111.111.111.11:11') - - await page.getByPlaceholder('请输入主机名或IP:端口').nth(1).click() - await page.getByPlaceholder('请输入主机名或IP:端口').nth(1).fill('222') - await page.getByRole('cell', { name: '请输入主机名或IP:端口 请输入主机名或IP:端口' }).getByText('请输入主机名或IP:端口').click() - await page.getByPlaceholder('请输入主机名或IP:端口').nth(2).click() - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('请输入主机名或IP:端口').nth(1).fill('222.222.222.22:22') - await page.getByLabel('按百分比').click() - await page.locator('section nz-form-item').filter({ hasText: '*灰度节点流量占比%' }).locator('nz-slider div').nth(1).click() - await page.getByRole('spinbutton').nth(1).click() - await page.getByRole('spinbutton').nth(1).fill('70') - await page.getByRole('spinbutton').nth(1).press('Enter') - await page.getByRole('spinbutton').first().click() - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.getByText('success').click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - await page.getByRole('cell', { name: 'testForE2e' }).last().click() - await page.getByText('灰度策略 / testForE2e /').click() - await page.getByRole('button', { name: '提交' }).click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - const priorityInput = await page.locator('input#priority') - const priorityInputW = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const priorityInputH = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(priorityInputW).toStrictEqual('346px') - await expect(priorityInputH).toStrictEqual('32px') - - const greyNodesInput = await page.getByRole('row', { name: '请输入主机名或IP:端口 ' }).getByPlaceholder('请输入主机名或IP:端口') - const greyNodesInputW = await greyNodesInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const greyNodesInputH = await greyNodesInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(greyNodesInputW).toStrictEqual('346px') - await expect(greyNodesInputH).toStrictEqual('32px') - - const greyNodes1btn = await page.getByRole('row', { name: '请输入主机名或IP:端口 ' }).getByRole('button', { name: '' }) - const greyNodes1btnW = await greyNodes1btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const greyNodes1btnH = await greyNodes1btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(greyNodes1btnW).toStrictEqual('20px') - await expect(greyNodes1btnH).toStrictEqual('32px') - - await page.getByRole('row', { name: '请输入主机名或IP:端口 ' }).getByRole('button', { name: '' }).click() - - const greyNodes2btn = await page.locator('.arrayItem tr >> nth = 2 >> button >> nth = 0') - const greyNodes2btnW = await greyNodes2btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const greyNodes2btnH = await greyNodes2btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(greyNodes2btnW).toStrictEqual('28px') - await expect(greyNodes2btnH).toStrictEqual('32px') - - const filterBtn1 = await page.locator('nz-form-item').filter({ hasText: '筛选流量 添加条件' }).getByRole('button', { name: '添加条件' }).first() - const filterBtn1W = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn1H = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn1BGC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const filterBtn1BC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const filterBtn1C = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn1W).toStrictEqual('82px') - await expect(filterBtn1H).toStrictEqual('32px') - await expect(filterBtn1BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn1BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn1C).toStrictEqual('rgba(0, 0, 0, 0.85)') - // filterBtn1.hover() - // filterBtn1BC = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(filterBtn1BC).toStrictEqual('rgb(34, 84, 157)') - // filterBtn1C = await filterBtn1.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(filterBtn1C).toStrictEqual('rgb(34, 84, 157)') - - const label1 = await page.getByText('按百分比') - const label2 = await page.getByText('按规则') - const label1C = await label1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const label2C = await label2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(label1C).toStrictEqual('rgb(0, 0, 0)') - await expect(label2C).toStrictEqual('rgba(0, 0, 0, 0.85)') - - const sider1 = await page.locator('section nz-form-item').filter({ hasText: '*灰度节点流量占比%' }).locator('nz-slider div').nth(1) - const sider1Input = await page.locator('eo-ng-input-group').first() - const sider2 = await page.locator('section nz-form-item').filter({ hasText: '*上游节点流量占比%' }).locator('nz-slider div').nth(1) - const sider2Input = await page.locator('eo-ng-input-group').last() - - const sider1W = await sider1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const sider1H = await sider1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const sider1Radius = await sider1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-radius')) - const sider1BG = await sider1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - - await expect(sider1W).toStrictEqual('318px') - await expect(sider1H).toStrictEqual('10px') - await expect(sider1Radius).toStrictEqual('16px') - await expect(sider1BG).toStrictEqual('rgb(217, 217, 217)') - - const sider1InputW = await sider1Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const sider1InputH = await sider1Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const sider1InputBC = await sider1Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - - await expect(sider1InputW).toStrictEqual('80px') - await expect(sider1InputH).toStrictEqual('32px') - await expect(sider1InputBC).toStrictEqual('rgb(217, 217, 217)') - - const sider2W = await sider2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const sider2H = await sider2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const sider2Radius = await sider2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-radius')) - const sider2BG = await sider2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - - await expect(sider2W).toStrictEqual('318px') - await expect(sider2H).toStrictEqual('10px') - await expect(sider2Radius).toStrictEqual('16px') - await expect(sider2BG).toStrictEqual('rgb(217, 217, 217)') - - const sider2InputW = await sider2Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const sider2InputH = await sider2Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const sider2InputBC = await sider2Input.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - - await expect(sider2InputW).toStrictEqual('80px') - await expect(sider2InputH).toStrictEqual('32px') - await expect(sider2InputBC).toStrictEqual('rgb(217, 217, 217)') - - await page.getByLabel('按规则').click() - const filterBtn2 = await page.getByRole('button', { name: '添加配置' }) - const filterBtn2W = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn2H = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn2BGC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const filterBtn2BC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - - await expect(filterBtn2W).toStrictEqual('82px') - await expect(filterBtn2H).toStrictEqual('32px') - await expect(filterBtn2BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn2BC).toStrictEqual('rgb(217, 217, 217)') - // filterBtn2.hover() - // filterBtn2BC = await filterBtn2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('border-color')) - // await expect(filterBtn2BC).toStrictEqual('rgb(34, 84, 157)') - // filterBtn2C = await filterBtn2.evaluate((element) => - // window.getComputedStyle(element).getPropertyValue('color')) - // await expect(filterBtn2C).toStrictEqual('rgb(34, 84, 157)') - - const continueSwitch = await page.locator('eo-ng-switch >> button') - const continueSwitchW = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const continueSwitchH = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(continueSwitchW).toStrictEqual('35px') - await expect(continueSwitchH).toStrictEqual('16px') - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/group/group.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/group/group.component.spec.ts deleted file mode 100644 index 77a65b6ef..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/group/group.component.spec.ts +++ /dev/null @@ -1,430 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-14 22:56:33 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-10-27 11:35:45 - * @FilePath: /apinto/src/app/layout/upstream/service-discovery-content/service-discovery-content.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../cache/create/create.component' -import { FuseCreateComponent } from '../fuse/create/create.component' -import { GreyCreateComponent } from '../grey/create/create.component' -import { TrafficCreateComponent } from '../traffic/create/create.component' -import { VisitCreateComponent } from '../visit/create/create.component' -import { GroupComponent } from './group.component' -import { NzTreeNode } from 'ng-zorro-antd/tree' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('GroupComponent test as editPage is false', () => { - let component: GroupComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [GroupComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(GroupComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getGroupList()', () => { - const spyGetGroupList = jest.spyOn(component, 'getGroupList') - const spyGetGroupItemSelected = jest.spyOn( - component, - 'getGroupItemSelected' - ) - expect(spyGetGroupList).not.toHaveBeenCalled() - expect(spyGetGroupItemSelected).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetGroupList).toHaveBeenCalledTimes(1) - expect(spyGetGroupItemSelected).toHaveBeenCalledTimes(1) - }) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spyUnsubscribe = jest.spyOn(component.subscription, 'unsubscribe') - expect(spyUnsubscribe).not.toHaveBeenCalled() - component.ngOnDestroy() - fixture.detectChanges() - expect(spyUnsubscribe).toHaveBeenCalledTimes(1) - }) - - it('##getGroupList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { api: { group_uuid: 123456 }, root: { groups: [] } } - }) - ) - const spyNodesTransfer = jest.spyOn(component, 'nodesTransfer') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyNodesTransfer).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getGroupList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyNodesTransfer).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getGroupList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getGroupList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getGroupList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getGroupList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - expect(spyMessage).toHaveBeenCalled() - }) - - it('##nodesTransfer & clustersTransfer test', () => { - const spyClusterTransfer = jest.spyOn(component, 'clustersTransfer') - expect(spyClusterTransfer).not.toBeCalled() - const val1: any = [ - { - clusters: [{ name: 'clu1' }, { name: 'clu2' }, { name: 'clu3' }], - name: 'env1' - }, - { - clusters: [{ name: 'clu4' }, { name: 'clu5' }, { name: 'clu6' }], - name: 'env2' - }, - { clusters: [], name: 'env3' } - ] - - let res = component.nodesTransfer([]) - fixture.detectChanges() - expect(res).toStrictEqual([]) - - component.activatedNode = null - component.clusterName = '' - component.clusterKey = '' - component.strategyType = 'traffic' - res = component.nodesTransfer(val1) - fixture.detectChanges() - expect(res).toStrictEqual([ - { - key: 'env1', - title: 'env1', - name: 'env1', - clusters: [ - { - key: 'clu1_env1', - name: 'clu1', - title: 'clu1', - isLeaf: true, - selected: true - }, - { key: 'clu2_env1', title: 'clu2', isLeaf: true, name: 'clu2' }, - { key: 'clu3_env1', title: 'clu3', isLeaf: true, name: 'clu3' } - ], - children: [ - { - key: 'clu1_env1', - name: 'clu1', - title: 'clu1', - isLeaf: true, - selected: true - }, - { key: 'clu2_env1', title: 'clu2', isLeaf: true, name: 'clu2' }, - { key: 'clu3_env1', title: 'clu3', isLeaf: true, name: 'clu3' } - ], - expanded: true - }, - { - key: 'env2', - title: 'env2', - name: 'env2', - clusters: [ - { key: 'clu4_env2', name: 'clu4', title: 'clu4', isLeaf: true }, - { key: 'clu5_env2', name: 'clu5', title: 'clu5', isLeaf: true }, - { key: 'clu6_env2', name: 'clu6', title: 'clu6', isLeaf: true } - ], - children: [ - { key: 'clu4_env2', name: 'clu4', title: 'clu4', isLeaf: true }, - { key: 'clu5_env2', name: 'clu5', title: 'clu5', isLeaf: true }, - { key: 'clu6_env2', name: 'clu6', title: 'clu6', isLeaf: true } - ] - }, - { - key: 'env3', - title: 'env3', - name: 'env3', - clusters: [], - isLeaf: true - } - ]) - }) - - it('##getGroupItemSelected test', fakeAsync(() => { - component.nodesList = [ - { - title: 'title1', - key: 'title1', - children: [ - { title: 'title11', name: 'title11', key: 'title11', selected: true } - ], - expanded: true - }, - { - title: 'title2', - key: 'title2', - children: [ - { title: 'title21', name: 'title21', key: 'title21' }, - { title: 'title22', name: 'title22', key: 'title22' }, - { title: 'title23', name: 'title23', key: 'title23' } - ], - expanded: false - }, - { - title: 'title3', - key: 'title3', - children: [{ title: 'title31', name: 'title31', key: 'title31' }], - expanded: false - } - ] - component.clusterName = 'title22' - component.getGroupItemSelected() - - expect(component.nodesList).toStrictEqual([ - { - title: 'title1', - key: 'title1', - children: [ - { title: 'title11', name: 'title11', key: 'title11', selected: false } - ], - expanded: true - }, - { - title: 'title2', - key: 'title2', - children: [ - { - title: 'title21', - name: 'title21', - key: 'title21', - selected: false - }, - { title: 'title22', name: 'title22', key: 'title22', selected: true }, - { title: 'title23', name: 'title23', key: 'title23', selected: false } - ], - expanded: true - }, - { - title: 'title3', - key: 'title3', - children: [ - { title: 'title31', name: 'title31', key: 'title31', selected: false } - ], - expanded: false - } - ]) - })) - - it('##activeNode test', () => { - component.clusterKey = '' - component.clusterName = '' - component.activatedNode = null - component.showList = false - component.showApiPage = false - component.strategyType = 'traffic' - - component.eoNgTreeDefault.getTreeNodeByKey = () => { - return null - } - // @ts-ignore - const data: any = { - keys: ['env1'], - node: { isExpanded: false, origin: { name: 'test', children: [] } } - } - - component.activeNode(data) - fixture.detectChanges() - - expect(component.clusterKey).toStrictEqual('env1') - expect(component.clusterName).toStrictEqual('test') - expect(component.activatedNode).toStrictEqual({ - isExpanded: false, - origin: { name: 'test', children: [] } - }) - expect(component.showList).toStrictEqual(true) - expect(component.showApiPage).toStrictEqual(false) - - component.clusterKey = 'env1' - component.clusterName = '' - component.activatedNode = null - component.showList = false - component.showApiPage = false - - const data2: any = { - keys: ['env1'], - node: { isExpanded: false, origin: { name: 'test', children: ['1'] } } - } - - component.activeNode(data2) - fixture.detectChanges() - - expect(component.clusterKey).toStrictEqual('env1') - expect(component.clusterName).toStrictEqual('') - expect(component.activatedNode).toStrictEqual(null) - expect(component.showList).toStrictEqual(false) - expect(component.showApiPage).toStrictEqual(false) - expect(data2.node.isExpanded).toStrictEqual(true) - - component.clusterKey = 'env2' - component.clusterName = '' - component.activatedNode = null - component.showList = false - component.showApiPage = false - component.eoNgTreeDefault.getTreeNodeByKey = () => { - return new NzTreeNode( - { title: 'test', key: 'env2', isSelected: true }, - null, - null - ) - } - - component.activeNode(data2) - fixture.detectChanges() - expect(data2.node.isExpanded).toStrictEqual(false) - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/group/group.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/group/group.component.test.ts deleted file mode 100644 index 5a21a4c0d..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/group/group.component.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -// 流量策略左侧分组组件 -// 需要补充:刷新停留本页 -describe('flow-control-group e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中', async () => { - // Go to http://localhost:4200/serv-goverance/flow-control - await page.goto('http://localhost:4200/serv-goverance/flow-control') - await page.waitForTimeout(2000) - - await expect(page.locator('nz-tree-indent + nz-tree-node-title').nth(1).getAttribute('class')).toContain('ant-tree-node-selected') - await expect(page.locator('nz-tree-indent + nz-tree-node-title').nth(2).getAttribute('class')).not.toContain('ant-tree-node-selected') - }) - it('点击分组中的一级节点(环境), 一级节点展开/收缩,右侧页面中的列表数据不变', async () => { - const rightSide = await page.$('.block_right') - let rightSideTest = await page.$('.block_right') - // 第一个环境中的集群可见 - await expect(page.locator('nz-tree-node-title:has-text("liu_localhost")')).not.toBeNull() - - // Click nz-tree-node-title:has-text("PRO") - await page.locator('nz-tree-node-title:has-text("PRO")').click() - rightSideTest = await page.$('.block_right') - // 第一个环境中的集群不可见 - await expect(page.locator('nz-tree-node-title:has-text("liu_localhost")')).toBeNull() - await expect(page.locator('nz-tree-node-title:has-text("apinto")')).toBeNull() - await expect(rightSide).toStrictEqual(rightSideTest) - - // Click nz-tree-node-title:has-text("DEV") - await page.locator('nz-tree-node-title:has-text("DEV")').click() - rightSideTest = await page.$('.block_right') - await expect(page.locator('nz-tree-node-title:has-text("apinto")')).not.toBeNull() - await expect(rightSide).toStrictEqual(rightSideTest) - }) - it('点击分组中的二级节点(集群), 右侧页面中的列表数据发生变化', async () => { - await page.locator('nz-tree-indent + nz-tree-node-title').nth(1).click() - const rightSide = await page.$('.block_right') - let rightSideTest = await page.$('.block_right') - - await page.locator('nz-tree-indent + nz-tree-node-title').nth(2).click() - rightSideTest = await page.$('.block_right') - await expect(rightSide).not.toStrictEqual(rightSideTest) - - await page.locator('nz-tree-indent + nz-tree-node-title').nth(3).click() - rightSideTest = await page.$('.block_right') - await expect(rightSide).not.toStrictEqual(rightSideTest) - }) - it('点击分组中的二级节点(集群), 被选中的节点背景色变化为--item-hover-background-color', async () => { - await page.locator('nz-tree-indent + nz-tree-node-title').nth(2).click() - await expect(page.locator('nz-tree-indent + nz-tree-node-title').nth(1).getAttribute('styles')).not.toContain('{background-color:var(--primary-color)}') - await expect(page.locator('nz-tree-indent + nz-tree-node-title').nth(2).getAttribute('styles')).toContain('{background-color:var(--primary-color)}') - }) - it('鼠标悬浮的节点背景色变化为--item-hover-background-color', async () => { - await page.locator('nz-tree-indent + nz-tree-node-title').nth(1).hover() - await expect(page.locator('nz-tree-indent + nz-tree-node-title').nth(1).getAttribute('styles')).not.toContain('{background-color:var(--primary-color)}') - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/list/list.component.spec.ts deleted file mode 100644 index cd7899d32..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/list/list.component.spec.ts +++ /dev/null @@ -1,1158 +0,0 @@ -/* eslint-disable dot-notation */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' - -import { EoNgSelectModule } from 'eo-ng-select' -import { ListComponent } from './list.component' -import { FuseCreateComponent } from '../fuse/create/create.component' -import { TrafficCreateComponent } from '../traffic/create/create.component' -import { GreyCreateComponent } from '../grey/create/create.component' -import { VisitCreateComponent } from '../visit/create/create.component' -import { CacheCreateComponent } from '../cache/create/create.component' -import { ReactiveFormsModule } from '@angular/forms' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('ListComponent test', () => { - let component: ListComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - EoNgSelectModule, - ReactiveFormsModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [ListComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ListComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should subscribe urlQueryParams change', () => { - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyGetStrategiesList).not.toHaveBeenCalled() - component.clusterName = '' - - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategiesList).toHaveBeenCalledTimes(1) - expect(component.clusterName).toStrictEqual('clus2') - }) - - it('##ngOnDestroy test', () => { - // @ts-ignore - const spySubscription = jest.spyOn(component.subscription, 'unsubscribe') - // @ts-ignore - expect(spySubscription).not.toHaveBeenCalled() - component.ngOnDestroy() - expect(spySubscription).toHaveBeenCalled() - }) - - it('##click table btns', () => { - component.strategyType = 'traffic' - const spyEditStrategy = jest.spyOn(component, 'editStrategy') - // @ts-ignore - const spyModalService = jest.spyOn(component.modalService, 'create') - const spyRecoverStrategy = jest.spyOn(component, 'recoverStrategy') - expect(spyEditStrategy).toHaveBeenCalledTimes(0) - expect(spyModalService).toHaveBeenCalledTimes(0) - expect(spyRecoverStrategy).toHaveBeenCalledTimes(0) - const open = jest.fn() - Object.defineProperty(window, 'open', open) - expect(open).not.toHaveBeenCalled() - - const item = { key: 'test' } - component.strategiesTableBody[8].btns[0].click(item) - expect(spyEditStrategy).toHaveBeenCalledTimes(1) - expect(spyModalService).toHaveBeenCalledTimes(0) - expect(spyRecoverStrategy).toHaveBeenCalledTimes(0) - component.strategiesTableBody[8].btns[1].click(item) - expect(spyEditStrategy).toHaveBeenCalledTimes(1) - expect(spyModalService).toHaveBeenCalledTimes(1) - expect(spyRecoverStrategy).toHaveBeenCalledTimes(0) - - component.strategiesTableBody[9].btns[0].click(item) - expect(spyEditStrategy).toHaveBeenCalledTimes(2) - expect(spyModalService).toHaveBeenCalledTimes(1) - expect(spyRecoverStrategy).toHaveBeenCalledTimes(0) - component.strategiesTableBody[9].btns[1].click(item) - expect(spyEditStrategy).toHaveBeenCalledTimes(2) - expect(spyModalService).toHaveBeenCalledTimes(1) - expect(spyRecoverStrategy).toHaveBeenCalledTimes(1) - - component.strategiesTableClick({ data: { uuid: 'test' } }) - expect(spyEditStrategy).toHaveBeenCalledTimes(3) - }) - - it('##getPublishList with success return and all data', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getPublishList() - fixture.detectChanges() - expect(component.publishList).toStrictEqual([1, 2, 3]) - expect(component.strategyIsPublish).toStrictEqual(true) - expect(component.strategySource).toStrictEqual('123') - expect(component.validateForm.controls['versionName'].value).toStrictEqual( - 'test1' - ) - expect(component.strategyUnpulishMsg).toStrictEqual('unpublish_test') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getPublishList with success return and no strategies', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - strategies: [], - isPublish: false, - source: '123', - versionName: 'test1', - unpublishMsg: '' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getPublishList() - fixture.detectChanges() - expect(component.publishList).toStrictEqual([]) - expect(component.strategyIsPublish).toStrictEqual(false) - expect(component.strategySource).toStrictEqual('123') - expect(component.validateForm.controls['versionName'].value).toStrictEqual( - 'test1' - ) - expect(component.strategyUnpulishMsg).toStrictEqual('当前无可发布策略') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getPublishList with success return and not publish', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: false, - source: '123', - versionName: 'test1', - unpublishMsg: '' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getPublishList() - fixture.detectChanges() - expect(component.publishList).toStrictEqual([1, 2, 3]) - expect(component.strategyIsPublish).toStrictEqual(false) - expect(component.strategySource).toStrictEqual('123') - expect(component.validateForm.controls['versionName'].value).toStrictEqual( - 'test1' - ) - expect(component.strategyUnpulishMsg).toStrictEqual('当前策略不可发布') - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getPublishList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getPublishList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategiesList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - strategies: [ - { priority: 1, uuid: '1' }, - { priority: 2, uuid: '2' } - ], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.clusterName = '' - component.getStrategiesList() - fixture.detectChanges() - expect(spyService).not.toHaveBeenCalled() - - component.clusterName = '1' - component.strategiesList = [] - component.priorityMap = new Map() - component.getStrategiesList() - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - - expect(component.strategiesList).toStrictEqual([ - { - priority: 1, - uuid: '1' - }, - { - priority: 2, - uuid: '2' - } - ]) - expect(component.priorityMap.get(1)).toStrictEqual([ - { priority: 1, uuid: '1' } - ]) - expect(component.priorityMap.get(2)).toStrictEqual([ - { priority: 2, uuid: '2' } - ]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategiesList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.clusterName = 'test' - component.getStrategiesList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##addStrategy & editStrategy test', () => { - component.strategyType = 'traffic' - // @ts-ignore - const spyChangeToContent = jest.spyOn(component.router, 'navigate') - expect(spyChangeToContent).not.toHaveBeenCalled() - - component.addStrategy() - fixture.detectChanges() - - expect(spyChangeToContent).toHaveBeenCalledTimes(1) - - component.editStrategy(1) - fixture.detectChanges() - - expect(spyChangeToContent).toHaveBeenCalledTimes(2) - }) - - it('##stopStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'patch') - .mockReturnValue(of({ code: 0, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.stopStrategy(1, true) - fixture.detectChanges() - - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetStrategiesList).toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##stopStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'patch') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.stopStrategy(1, false) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##stopStrategy with fail return without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'patch') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.stopStrategy(1, false) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('启用策略失败!') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.stopStrategy(1, true) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('停用策略失败!') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##stopStrategy with fail return without msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'patch') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.stopStrategy(1, true) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('停用策略失败!') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##deleteStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: 0, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.deleteStrategy(1) - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyGetStrategiesList).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - }) - - it('##deleteStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.deleteStrategy(1) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - }) - - it('##deleteStrategy with fail return but no msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'delete') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.deleteStrategy(1) - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('删除策略失败!') - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - }) - - it('##recoverStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'patch').mockReturnValue( - of({ - code: 0, - data: { - strategies: [ - { priority: 1, uuid: '1' }, - { priority: 2, uuid: '2' } - ], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.clusterName = '' - component.recoverStrategy(1) - fixture.detectChanges() - expect(spyService).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetStrategiesList).toHaveBeenCalled() - }) - - it('##recoverStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'patch') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.clusterName = 'test' - component.recoverStrategy('1') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##openDrawer and reset validateForm', () => { - const spyGetPublishList = jest.spyOn(component, 'getPublishList') - expect(component.drawerPublishRef).toBeUndefined() - expect(spyGetPublishList).not.toHaveBeenCalled() - component.validateForm.controls['desc'].setValue('test1') - component.validateForm.controls['versionName'].setValue('test2') - component.openDrawer('test') - fixture.detectChanges() - expect(component.drawerPublishRef).toBeUndefined() - expect(spyGetPublishList).not.toHaveBeenCalled() - expect(component.validateForm.controls['desc'].value).toStrictEqual('test1') - expect(component.validateForm.controls['versionName'].value).toStrictEqual( - 'test2' - ) - - component.openDrawer('publish') - fixture.detectChanges() - expect(component.drawerPublishRef).not.toBeUndefined() - expect(spyGetPublishList).toHaveBeenCalled() - expect(component.validateForm.controls['desc'].value).toStrictEqual('') - expect(component.validateForm.controls['versionName'].value).toStrictEqual( - '' - ) - }) - - it('##cancelDrawer', () => { - component.openDrawer('publish') - // @ts-ignore - component.drawerPublishRef.close = () => { - return 'drawer is close' - } - - // @ts-ignore - const spyFn = jest.spyOn(component.drawerPublishRef, 'close') - expect(spyFn).not.toHaveBeenCalled() - - component.cancelDrawer('test') - fixture.detectChanges() - expect(spyFn).not.toHaveBeenCalled() - // expect(spyClearForm).toHaveBeenCalledTimes(0) - - component.cancelDrawer('publish') - fixture.detectChanges() - expect(spyFn).toHaveBeenCalled() - // expect(spyClearForm).toHaveBeenCalledTimes(1) - }) - - it('##publish with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue( - of({ - code: 0, - data: { - strategies: [ - { priority: 1, uuid: '1' }, - { priority: 2, uuid: '2' } - ], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - component.openDrawer('publish') - // @ts-ignore - component.drawerPublishRef.close = () => { - return 'drawer is close' - } - // @ts-ignore - const spyFn = jest.spyOn(component.drawerPublishRef, 'close') - expect(spyFn).not.toHaveBeenCalled() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - // 表单验证失败 且未返回isPublish - const spyOnControlVerMarkAsDirty = jest.spyOn( - component.validateForm.controls['versionName'], - 'markAsDirty' - ) - component.publish() - fixture.detectChanges() - expect(spyFn).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyOnControlVerMarkAsDirty).toHaveBeenCalledTimes(1) - - // 表单验证成功 未返回isPublish - component.validateForm.controls['versionName'].setValue('test') - component.strategyIsPublish = '' - component.publish() - fixture.detectChanges() - expect(spyFn).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - // 表单验证失败 返回isPublish - component.validateForm.controls['versionName'].setValue('') - component.strategyIsPublish = 'test' - component.publish() - fixture.detectChanges() - expect(spyFn).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyService).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - expect(spyOnControlVerMarkAsDirty).toHaveBeenCalledTimes(2) - - // 表单验证成功 返回isPublish - component.validateForm.controls['versionName'].setValue('test') - component.strategyIsPublish = 'test' - component.publish() - fixture.detectChanges() - expect(spyFn).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetStrategiesList).toHaveBeenCalled() - }) - - it('##publish with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - component.openDrawer('publish') - // @ts-ignore - component.drawerPublishRef.close = () => { - return 'drawer is close' - } - // @ts-ignore - const spyFn = jest.spyOn(component.drawerPublishRef, 'close') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.validateForm.controls['versionName'].setValue('test') - component.strategyIsPublish = 'test' - component.publish() - fixture.detectChanges() - - expect(spyFn).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##publish with fail return no msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - component.openDrawer('publish') - // @ts-ignore - component.drawerPublishRef.close = () => { - return 'drawer is close' - } - // @ts-ignore - const spyFn = jest.spyOn(component.drawerPublishRef, 'close') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.validateForm.controls['versionName'].setValue('test') - component.strategyIsPublish = 'test' - component.publish() - fixture.detectChanges() - - expect(spyFn).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('发布策略失败!') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##changeEditingPriority 修改优先级', fakeAsync(() => { - component.editingPriority = '' - const e: Event = new Event('test') - const spyEPropagation = jest.spyOn(e, 'stopPropagation') - expect(spyEPropagation).not.toHaveBeenCalled() - component.changeEditingPriority(e, '2') - expect(component.editingPriority).toStrictEqual(2) - expect(spyEPropagation).toHaveBeenCalledTimes(1) - component.changeEditingPriority(e, '') - expect(component.editingPriority).toStrictEqual('NULL') - expect(spyEPropagation).toHaveBeenCalledTimes(2) - })) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - component.disabledEdit(false) - expect(component.nzDisabled).toStrictEqual(false) - })) - - it('##checkPriority 输入为空或大于999时, 放入priorityMap中key为NULL的数组中,并提示优先级为空或大于999不允许提交', fakeAsync(() => { - const spyChangePriorityMap = jest.spyOn(component, 'changePriorityMap') - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - const spyChangePriority = jest.spyOn(component, 'changePriority') - expect(spyChangePriorityMap).not.toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - expect(spyChangePriority).not.toHaveBeenCalled() - component.editingPriority = '' - component.checkPriority('', 'test') - expect(spyChangePriorityMap).not.toHaveBeenCalled() - expect(spyMessageError).toBeCalledWith('优先级不能为空, 请填写后提交') - expect(spyChangePriority).not.toHaveBeenCalled() - - component.editingPriority = 5 - component.priorityMap.set(5, [{ uuid: 'test', name: 'testName' }]) - component.checkPriority('', 'test') - expect(spyChangePriorityMap).toHaveBeenCalled() - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageError).toBeCalledWith('优先级不能为空, 请填写后提交') - expect(spyChangePriority).not.toHaveBeenCalled() - - component.checkPriority('9999', 'test') - expect(spyChangePriorityMap).toHaveBeenCalledTimes(2) - expect(spyMessageError).toHaveBeenCalledTimes(3) - expect(spyMessageError).toBeCalledWith( - '优先级范围在1-999之间,请修改后提交' - ) - expect(spyChangePriority).not.toHaveBeenCalled() - })) - - it('##输入不为空, 检查priorityMap中相同priority的数组,', fakeAsync(() => { - const spyChangePriorityMap = jest.spyOn(component, 'changePriorityMap') - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - const spyChangePriority = jest.spyOn(component, 'changePriority') - // @ts-ignore - const spyScrollToAnchor = jest.spyOn(component.viewportScroller, 'scrollToAnchor' - ) - expect(spyChangePriorityMap).not.toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - expect(spyChangePriority).not.toHaveBeenCalled() - expect(spyScrollToAnchor).not.toHaveBeenCalled() - - component.priorityDangerP = [] - component.editingPriority = 5 - component.priorityMap.set(3, [{ uuid: 'test1', name: 'test1Name' }]) - component.priorityMap.set(5, [{ uuid: 'test', name: 'testName' }]) - component.checkPriority(3, 'test') - expect(spyChangePriorityMap).toHaveBeenCalled() - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageError).toBeCalledWith( - '修改后的优先级与test1Name冲突,无法自动提交' - ) - expect(spyChangePriority).not.toHaveBeenCalled() - expect(component.priorityDangerP).toStrictEqual([3]) - - component.priorityMap.set(6, [{ uuid: 'test', name: 'testName' }]) - component.editingPriority = 6 - component.checkPriority('3', 'test') - expect(spyChangePriorityMap).toHaveBeenCalledTimes(2) - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageError).toBeCalledWith( - '优先级存在冲突或数值超出范围,无法自动提交' - ) - expect(spyChangePriority).not.toHaveBeenCalled() - expect(component.priorityDangerP).toStrictEqual([3]) - - component.priorityMap.set(5, [{ uuid: 'test', name: 'testName' }]) - component.editingPriority = 5 - component.priorityDangerP = [] - component.checkPriority('3', 'test') - expect(spyChangePriorityMap).toHaveBeenCalledTimes(3) - expect(spyMessageError).toHaveBeenCalledTimes(3) - expect(spyMessageError).toBeCalledWith( - '优先级存在冲突或数值超出范围,无法自动提交' - ) - expect(spyChangePriority).not.toHaveBeenCalled() - expect(component.priorityDangerP).toStrictEqual([3]) - })) - - it('##checkPriority 存在冲突优先级,无法成功提交', () => { - const spyChangePriorityMap = jest.spyOn(component, 'changePriorityMap') - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyChangePriority = jest.spyOn(component, 'changePriority') - // @ts-ignore - const spyScrollToAnchor = jest.spyOn(component.viewportScroller, 'scrollToAnchor' - ) - expect(spyChangePriorityMap).not.toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyChangePriority).not.toHaveBeenCalled() - expect(spyScrollToAnchor).not.toHaveBeenCalled() - - component.priorityDangerP = [] - component.editingPriority = 5 - component.priorityMap.set(1, [{ uuid: 'test' }, { uuid: 'test2' }]) - component.priorityMap.set('NULL', [{ uuid: 'test' }, { uuid: 'test2' }]) - component.priorityMap.set(3, []) - component.priorityMap.set(5, [{ uuid: 'test', name: 'testName' }]) - component.checkPriority(3, 'test') - expect(spyChangePriorityMap).toHaveBeenCalled() - expect(spyMessageError).toHaveBeenCalled() - expect(spyMessageError).toBeCalledWith( - '优先级存在冲突或数值超出范围,无法自动提交' - ) - expect(spyChangePriority).not.toHaveBeenCalled() - }) - - it('##checkPriority 无冲突优先级,成功提交', () => { - const spyChangePriorityMap = jest.spyOn(component, 'changePriorityMap') - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyChangePriority = jest.spyOn(component, 'changePriority') - // @ts-ignore - const spyScrollToAnchor = jest.spyOn(component.viewportScroller, 'scrollToAnchor' - ) - expect(spyChangePriorityMap).not.toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyChangePriority).not.toHaveBeenCalled() - expect(spyScrollToAnchor).not.toHaveBeenCalled() - - component.priorityDangerP = [] - component.editingPriority = 5 - component.priorityMap.set(3, []) - component.priorityMap.set(5, [{ uuid: 'test', name: 'testName' }]) - component.checkPriority(3, 'test') - expect(spyChangePriorityMap).toHaveBeenCalled() - expect(spyMessageError).not.toHaveBeenCalled() - expect(spyChangePriority).toHaveBeenCalled() - }) - - it('##changePriorityMap 将策略从priorityMap的editingPriority中移除, 放入priority的数组中', fakeAsync(() => { - component.priorityMap = new Map() - component.priorityMap.set(1, [{ uuid: 'test1' }]) - component.priorityMap.set(2, [{ uuid: 'test2' }]) - component.priorityMap.set(3, [{ uuid: 'test3' }]) - - component.changePriorityMap(1, 4, 'test1') - expect(component.priorityMap.get(4)).toStrictEqual([{ uuid: 'test1' }]) - expect(component.priorityMap.get(1)).toStrictEqual([]) - - component.changePriorityMap(2, 3, 'test2') - expect(component.priorityMap.get(3)).toStrictEqual([ - { uuid: 'test3' }, - { uuid: 'test2' } - ]) - expect(component.priorityMap.get(2)).toStrictEqual([]) - })) - - it('##changePriorityMap 将策略从priorityMap的editingPriority中移除, 放入priority的数组中', fakeAsync(() => { - component.priorityDangerP = [1, 2, 3, 4, 5] - expect(component.checkListStatus('')).toStrictEqual('error') - expect(component.checkListStatus(2)).toStrictEqual('error') - expect(component.checkListStatus(6)).toStrictEqual('') - })) - - it('##checkPriorityMap test', fakeAsync(() => { - component.priorityMap.set(1, [{ uuid: 'test' }, { uuid: 'test2' }]) - component.priorityMap.set('NULL', [{ uuid: 'test' }, { uuid: 'test2' }]) - expect(component.checkPriorityMap()).toStrictEqual(false) - expect(component.priorityDangerP).toStrictEqual([1]) - })) - - it('##changePriority with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'post').mockReturnValue( - of({ - code: 0, - data: { - strategies: [ - { priority: 1, uuid: '1' }, - { priority: 2, uuid: '2' } - ], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - - component.priorityMap = new Map() - component.priorityMap.set('NULL', []) - component.priorityMap.set('2', [{ uuid: 'test1' }]) - component.priorityMap.set('21', [{ uuid: 'tets2' }, { uuid: 'test3' }]) - component.priorityMap.set(3, [{ uuid: 'test4' }]) - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.changePriority() - fixture.detectChanges() - - expect(component.prioritySaveMap).toStrictEqual({ - test1: 2, - test4: 3 - }) - expect(spyMessage).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetStrategiesList).toHaveBeenCalled() - }) - - it('##changePriority with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.changePriority() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##changePriority with fail return no msg', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetStrategiesList = jest.spyOn(component, 'getStrategiesList') - - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - - component.changePriority() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('修改优先级失败!') - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyGetStrategiesList).not.toHaveBeenCalled() - }) - - it('##strategyConf and getBreadcrumb test', fakeAsync(() => { - // @ts-ignore - const spyReqFlashBreadcrumb = jest.spyOn(component.navigationService, 'reqFlashBreadcrumb' - ) - expect(spyReqFlashBreadcrumb).not.toHaveBeenCalled() - - component.strategyType = 'test' - expect(component.strategyConf()).toStrictEqual('限流规则') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '流量策略' }]) - - component.strategyType = 'traffic' - expect(component.strategyConf()).toStrictEqual('限流规则') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '流量策略' }]) - - component.strategyType = 'grey' - expect(component.strategyConf()).toStrictEqual('灰度规则') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '灰度策略' }]) - - component.strategyType = 'fuse' - expect(component.strategyConf()).toStrictEqual('熔断维度') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '熔断策略' }]) - - component.strategyType = 'cache' - expect(component.strategyConf()).toStrictEqual('缓存有效时间') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '缓存策略' }]) - - component.strategyType = 'visit' - expect(component.strategyConf()).toStrictEqual('访问规则') - component.getBreadcrumb() - expect(spyReqFlashBreadcrumb).lastCalledWith([{ title: '访问策略' }]) - })) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/list/list.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/list/list.component.test.ts deleted file mode 100644 index 80ae7a56e..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/list/list.component.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -// 流量策略列表页 -// 优先级编辑 -describe('traffic-list e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/serv-goverance/traffic') - await page.waitForTimeout(2000) - }) - it('点击优先级和更新时间标题栏的排序按钮, 列表相应排序', async () => { - const firstP = await page.$('td:nth-child(2) >> nth = 0') - - await page.locator('nz-table-sorters:has-text("优先级")').click() - - let firstPTest = await page.$('td:nth-child(2) >> nth = 0') - expect(firstPTest).not.toStrictEqual(firstP) - - await page.locator('nz-table-sorters:has-text("优先级")').click() - firstPTest = await page.$('td:nth-child(2) >> nth = 0') - expect(firstPTest).toStrictEqual(firstP) - - await page.locator('nz-table-sorters:has-text("更新时间")').click() - const firstT = await page.$('td:nth-child(8) >> nth = 0') - - await page.locator('nz-table-sorters:has-text("更新时间")').click() - let firstTTest = await page.$('td:nth-child(8) >> nth = 0') - expect(firstTTest).not.toStrictEqual(firstT) - - await page.locator('nz-table-sorters:has-text("更新时间")').click() - firstTTest = await page.$('td:nth-child(8) >> nth = 0') - expect(firstTTest).toStrictEqual(firstT) - }) - - it('鼠标悬浮在启停标题栏, 提示[策略的限流规则是否被生效执行]', async () => { - await expect(page.locator('text=策略的限流规则是否被生效执行')).toBeUndefined() - await page.locator('text=启停').hover() - await expect(page.locator('text=策略的限流规则是否被生效执行')).not.toBeUndefined() - }) - - it('修改优先级, 将优先级空置, 此时页面出现全局消息提示, 并将输入框标红', async () => { - await expect(page.locator('div:has-text("优先级不能为空, 请填写后提交")')).toBeUndefined() - await page.locator('td:nth-child(2) >> nth = 0').fill('') - await expect(page.locator('div:has-text("优先级不能为空, 请填写后提交")')).not.toBeUndefined() - }) - - it('修改优先级, 将优先级修改为与其他列冲突的等级, 此时页面出现全局消息提示, 并将两个输入框标红', async () => { - await expect(page.locator('div:has-text("修改后的优先级与test1冲突,无法自动提交")')).toBeUndefined() - await page.locator('td:nth-child(2) >> nth = 0').fill('1') - await page.locator('td:nth-child(2) >> nth = 1').fill('1') - await expect(page.locator('div:has-text("修改后的优先级与test1冲突,无法自动提交")')).not.toBeUndefined() - }) - - it('修改优先级, 将优先级修改为与其他列不冲突的等级, 此时页面出现成功的全局消息提示', async () => { - await expect(page.locator('div:has-text("修改优先级成功")')).toBeUndefined() - await page.locator('td:nth-child(2) >> nth = 1').fill('2') - await expect(page.locator('div:has-text("修改优先级成功")')).toBeUndefined() - }) - - it('点击启停开关, 页面出现全局消息提示(请求发送成功)', async () => { - await expect(page.locator('div:has-text("停用策略成功")')).toBeUndefined() - await page.locator('td:nth-child(4) >> nth = 1').click() - await expect(page.locator('div:has-text("停用策略成功")')).not.toBeUndefined() - }) - - it('点击新建策略按钮,右侧页面将变为新建策略页,点击取消,页面返回列表页', async () => { - await expect(page.locator('text=英文数字下划线任意一种,首字母必须为英文')).toBeUndefined() - await page.locator('button:has-text("新建策略")').click() - await expect(page.locator('text=英文数字下划线任意一种,首字母必须为英文')).not.toBeUndefined() - - await expect(page.locator('text=启停')).toBeUndefined() - await page.locator('button:has-text("取消")').click() - await expect(page.locator('text=启停')).not.toBeUndefined() - }) - - it('点击发布按钮,页面出现弹窗,清空发布名称则不可发布,点击取消,页面返回列表页', async () => { - await expect(page.locator('text=发布名称')).toBeUndefined() - await page.locator('button:has-text("发布")').click() - await expect(page.locator('text=发布名称')).not.toBeUndefined() - - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(false) - await page.locator('.mg_content input').fill('') - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(true) - - await page.locator('button:has-text("取消")').click() - await expect(page.locator('text=发布名称')).toBeUndefined() - }) - - it('点击发布按钮,页面出现弹窗,后端未返回source字段时不可发布,点击关闭,页面返回列表页', async () => { - await page.locator('button:has-text("发布")').click() - - await page.locator('[aria-label="Close"]').click() - }) - - it('点击发布按钮,页面出现弹窗,点击保存,页面返回列表页并出现全局消息提示', async () => { - await expect(page.locator('div:has-text("发布策略成功!")')).toBeUndefined() - await page.locator('button:has-text("发布")').click() - await expect(page.locator('text=发布名称')).not.toBeUndefined() - await page.locator('button:has-text("保存")').click() - await expect(page.locator('text=发布名称')).toBeUndefined() - await expect(page.locator('div:has-text("发布策略成功!")')).not.toBeUndefined() - }) - - it('点击列表中的查看按钮,右侧页面变为编辑策略页,策略名称与列表中策略名相同, 点击保存, 页面返回列表页并出现全局消息提示', async () => { - await page.locator('td:nth-child(9) >> nth=0 >>text=查看').click() - await expect(page.locator('text=test1')).not.toBeUndefined() - await expect(page.locator('text=英文数字下划线任意一种,首字母必须为英文')).not.toBeUndefined() - - await expect(page.locator('div:has-text("修改成功!")')).toBeUndefined() - await page.locator('button:has-text("保存")').click() - await expect(page.locator('div:has-text("修改成功!")')).not.toBeUndefined() - }) - - it('点击列表中的查看按钮,右侧页面变为编辑策略页,策略名称与列表中策略名相同, 点击取消, 页面返回列表页', async () => { - await expect(page.locator('button:has-text("新建策略")')).not.toBeUndefined() - await page.locator('td:nth-child(9) >> nth=0 >>text=查看').click() - await expect(page.locator('text=英文数字下划线任意一种,首字母必须为英文')).not.toBeUndefined() - await expect(page.locator('button:has-text("新建策略")')).toBeUndefined() - - await page.locator('button:has-text("取消")').click() - await expect(page.locator('button:has-text("新建策略")')).not.toBeUndefined() - await expect(page.locator('text=英文数字下划线任意一种,首字母必须为英文')).not.toBeUndefined() - }) - - it('点击列表中的删除按钮 页面出现全局消息提示', async () => { - await page.locator('td:nth-child(9) >> nth=0 >>text=删除').click() - await page.locator('button:has-text("确定")').click() - }) - - it('点击列表中的恢复按钮 页面出现全局消息提示', async () => { - await expect(page.locator('text=恢复策略成功')).toBeUndefined() - - await page.locator('text=恢复').click() - await expect(page.locator('text=恢复策略成功')).not.toBeUndefined() - }) - - it('列表每列的width和每行的height, 新建策略按钮和发布按钮的大小与背景色', async () => { - }) - it('列表每栏的width, 新建策略按钮和发布按钮的大小与背景色', async () => { - }) - it('发布状态待更新-字体红色,已上线-绿色,待删除-橘色, 未上线-黑色', async () => { - }) - it('启停状态 启动-switch背景色为绿色, 停用-背景色为灰色', async () => { - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/response-form/response-form.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/response-form/response-form.component.spec.ts deleted file mode 100644 index 675bfc97e..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/response-form/response-form.component.spec.ts +++ /dev/null @@ -1,323 +0,0 @@ -/* eslint-disable dot-notation */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, SimpleChange, SimpleChanges } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../cache/create/create.component' -import { FuseCreateComponent } from '../fuse/create/create.component' -import { GreyCreateComponent } from '../grey/create/create.component' -import { TrafficCreateComponent } from '../traffic/create/create.component' -import { VisitCreateComponent } from '../visit/create/create.component' -import { ResponseFormComponent } from './response-form.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('ResponseFormComponent test as editPage is false', () => { - let component: ResponseFormComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [ResponseFormComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ResponseFormComponent) - component = fixture.componentInstance - fixture.detectChanges() - - component._responseForm = new UntypedFormGroup({ - statusCode: new UntypedFormControl([200, [Validators.required, Validators.pattern(/^[1-9]{1}\d{2}$/)]]), - contentType: new UntypedFormControl(['application/json', [Validators.required]]), - charset: new UntypedFormControl(['UTF-8', [Validators.required]]), - header: new UntypedFormControl([]), - body: new UntypedFormControl([]) - }) - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##set responseHeaderList', () => { - const spyResonseListChange = jest.spyOn(component.responseHeaderListChange, 'emit') - expect(spyResonseListChange).not.toHaveBeenCalled() - - component.responseHeaderList = [{ key: 'key', value: 'value', test: 'test' }] - fixture.detectChanges() - - expect(spyResonseListChange).toHaveBeenCalledTimes(1) - // @ts-ignore - expect(component._responseHeaderList).toStrictEqual([{ key: 'key', value: 'value', test: 'test' }]) - }) - - it('##responseHeaderTableBody test', fakeAsync(() => { - expect(component.responseHeaderTableBody[0].disabledFn()).toStrictEqual(false) - expect(component.responseHeaderTableBody[1].disabledFn()).toStrictEqual(false) - expect(component.responseHeaderTableBody[2].btns[0].disabledFn()).toStrictEqual(false) - expect(component.responseHeaderTableBody[3].btns[0].disabledFn()).toStrictEqual(false) - expect(component.responseHeaderTableBody[3].btns[1].disabledFn()).toStrictEqual(false) - })) - - it('##ngOnInit should call getContentTypeList && getCharsetList', () => { - const spyGetContentTypeList = jest.spyOn(component, 'getContentTypeList') - const spyGetCharsetList = jest.spyOn(component, 'getCharsetList') - expect(spyGetContentTypeList).not.toHaveBeenCalled() - expect(spyGetCharsetList).not.toHaveBeenCalled() - component.responseForm = new UntypedFormGroup({ - statusCode: new UntypedFormControl([200, [Validators.required, Validators.pattern(/^[1-9]{1}\d{2}$/)]]), - contentType: new UntypedFormControl(['application/json', [Validators.required]]), - charset: new UntypedFormControl(['UTF-8', [Validators.required]]), - header: new UntypedFormControl([]), - body: new UntypedFormControl([]) - }) - component.ngOnInit() - fixture.detectChanges() - expect(spyGetContentTypeList).toHaveBeenCalledTimes(1) - expect(spyGetCharsetList).toHaveBeenCalledTimes(1) - }) - - it('##ngOnChanges and disabled test', () => { - const spyFormDisabled = jest.spyOn(component.responseForm, 'disable') - expect(spyFormDisabled).not.toHaveBeenCalled() - component.disabled = true - const changes:SimpleChanges = { disabled: new SimpleChange(false, true, false) } - component.ngOnChanges(changes) - expect(spyFormDisabled).toHaveBeenCalled() - }) - - it('##getContentTypeList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { items: [{ contentType: 'test1', body: 'test1' }, { contentType: 'test2', body: 'test2' }, { contentType: 'test3', body: 'test3' }] } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - component._responseForm.controls['contentType'].setValue('test1') - component.getContentTypeList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component._contentTypeList).toStrictEqual([{ label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }]) - expect(component.contentTypeList).toStrictEqual([{ label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }]) - expect(component.contentTypeMap.get('test1')).toStrictEqual('test1') - expect(component.contentTypeMap.get('test2')).toStrictEqual('test2') - expect(component.contentTypeMap.get('test3')).toStrictEqual('test3') - - expect(component._responseForm.controls['body'].value).toStrictEqual('test1') - - component.editPage = true - component._responseForm.controls['body'].setValue('') - - component.getContentTypeList() - fixture.detectChanges() - - expect(component._responseForm.controls['body'].value).toStrictEqual('') - }) - - it('##getContentTypeList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getContentTypeList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getContentTypeList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getContentTypeList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getCharsetList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { items: ['test1', 'test2', 'test3'] } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getCharsetList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component.charsetList).toStrictEqual([{ label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }]) - }) - - it('##getCharsetList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getCharsetList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getCharsetList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getCharsetList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - expect(spyMessage).toHaveBeenCalled() - }) - - it('##changeContentType test', fakeAsync(() => { - component.contentTypeList = [] - component._contentTypeList = [{ label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }] - - component.changeContentType('testChange') - - expect(component.contentTypeList).toStrictEqual([{ label: 'testChange', value: 'testChange' }, { label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }]) - - component.changeContentType('test3') - expect(component.contentTypeList).toStrictEqual([{ label: 'test1', value: 'test1' }, { label: 'test2', value: 'test2' }, { label: 'test3', value: 'test3' }]) - })) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.spec.ts deleted file mode 100644 index 85385e504..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.spec.ts +++ /dev/null @@ -1,796 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { CacheCreateComponent } from '../../cache/create/create.component' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { VisitCreateComponent } from '../../visit/create/create.component' -import { TrafficCreateComponent } from './create.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('TrafficCreateComponent test as editPage is false', () => { - let component: TrafficCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [TrafficCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2', strategy_uuid: 'uuid' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(TrafficCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - const spyGetMetricsList = jest.spyOn(component, 'getMetricsList') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - expect(spyGetMetricsList).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - expect(spyGetMetricsList).toHaveBeenCalledTimes(1) - }) - - it('##ngOnChanges test', () => { - component.strategyUuid = '' - component.createStrategyForm.uuid = '1' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('1') - - component.strategyUuid = '123' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('123') - }) - - it('##getStrategyMessage with success return (without optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const mockValue1: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - config: { - response: { - statusCode: '', - contentType: 'default_value', - charset: 'default_value', - header: [ - { - key: 'default_value', - value: 'default_value' - } - ], - body: 'default_value' - } - } - } - } - } - - const expectCreateStrategyForm: any = { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - filters: [], - config: { - metrics: [], - response: { - statusCode: '', - contentType: 'default_value', - charset: 'default_value', - header: [ - { - key: 'default_value', - value: 'default_value' - } - ], - body: 'default_value' - } - } - } - - const expValidateForm: any = { - name: 'default_value', - desc: 'default_value', - priority: '', - limitQuerySecond: 0, - limitQueryMinute: 0, - limitQueryHour: 0, - limitTrafficSecond: 0, - limitTrafficMinute: 0, - limitTrafficHour: 0 - } - - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue1)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - - expect(component.createStrategyForm).toStrictEqual(expectCreateStrategyForm) - expect(component.validateForm.value).toStrictEqual(expValidateForm) - expect(component.filterNamesSet).toStrictEqual(new Set()) - expect(component.filterShowList).toStrictEqual([]) - expect(component.responseHeaderList).toStrictEqual([ - { key: 'default_value', value: 'default_value' } - ]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 200, - contentType: 'default_value', - charset: 'default_value', - header: null, - body: 'default_value' - }) - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategyMessage with success return (with null response)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - filters: [], - config: { - metrics: [], - response: { - statusCode: '', - contentType: '', - charset: '', - header: [ - ], - body: '' - } - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(component.responseHeaderList).toStrictEqual([{ key: '', value: '' }]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 200, - contentType: 'application/json', - charset: 'UTF-8', - header: null, - body: '' - }) - expect(component.responseForm.controls['contentType'].value).toStrictEqual('application/json') - expect(component.responseForm.controls['charset'].value).toStrictEqual('UTF-8') - expect(component.responseForm.controls['body'].value).toStrictEqual('') - }) - - it('##getStrategyMessage with success return (with optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - metrics: ['test1', 'test2'], - query: { second: 0, minute: 0, hour: 0 }, - traffic: { second: 0, minute: 0, hour: 0 } - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(component.createStrategyForm).toStrictEqual({ - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - metrics: ['test1', 'test2'], - query: { second: 0, minute: 0, hour: 0 }, - traffic: { second: 0, minute: 0, hour: 0 } - } - }) - expect(component.filterNamesSet).toStrictEqual(new Set(['testF'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'testF', uuid: '123' } - ]) - expect(spyService).toHaveBeenCalled() - expect(component.responseHeaderList).toStrictEqual([{ key: '', value: '' }]) - expect(component.responseForm.value).toStrictEqual({ - statusCode: 200, - contentType: 'application/json', - charset: 'UTF-8', - header: null, - body: '' - }) - expect(component.responseForm.controls['contentType'].value).toStrictEqual('application/json') - expect(component.responseForm.controls['charset'].value).toStrictEqual('UTF-8') - expect(component.responseForm.controls['body'].value).toStrictEqual('') - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - })) - - it('##getMetricsList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - options: [ - { title: 'test1', name: 'testName1' }, - { title: 'test2', name: 'testName2' }, - { title: 'test3', name: 'testName3' }, - { title: 'test4', name: 'testName4' } - ] - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.metricsList = [{ label: 't', value: 'n' }] - component.getMetricsList() - fixture.detectChanges() - - expect(component.metricsList).toStrictEqual([ - { label: 'test1', value: 'testName1' }, - { label: 'test2', value: 'testName2' }, - { label: 'test3', value: 'testName3' }, - { label: 'test4', value: 'testName4' } - ]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getMetricsList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getMetricsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getMetricsList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getMetricsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - }) - - it('## saveStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - strategies: [1, 2, 3], - isPublish: true, - source: '123', - versionName: 'test1', - unpublishMsg: 'unpublish_test' - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - const spyBackToList = jest.spyOn(component, 'backToList') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - component.filterShowList = [{ title: 'test1', label: 'test1', name: 'test1', values: [''] }, { title: 'test2', label: 'test2', name: 'test2', values: [''] }, { title: 'test3', label: 'test3', name: 'test3', values: [] }] - - component.createStrategyForm.config.metrics = ['test'] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(2222) - component.validateForm.controls['limitQuerySecond'].setValue(2) - component.validateForm.controls['limitQueryMinute'].setValue(2) - component.validateForm.controls['limitQueryHour'].setValue(2) - component.validateForm.controls['limitTrafficSecond'].setValue(2) - component.validateForm.controls['limitTrafficMinute'].setValue(2) - component.validateForm.controls['limitTrafficHour'].setValue(2) - component.responseForm.controls['statusCode'].setValue('') - component.responseForm.controls['contentType'].setValue('') - component.responseForm.controls['charset'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['priority'].setValue(222) - component.responseForm.controls['statusCode'].setValue('201') - component.responseForm.controls['contentType'].setValue('test') - component.responseForm.controls['charset'].setValue('') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['priority'].setValue(222) - component.responseForm.controls['statusCode'].setValue('201') - component.responseForm.controls['contentType'].setValue('test') - component.responseForm.controls['charset'].setValue('test') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(component.createStrategyForm.filters).toStrictEqual([ - { name: 'test1', values: [''] }, - { name: 'test2', values: [''] }, - { name: 'test3', values: [] } - ]) - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyBackToList).toHaveBeenCalledTimes(2) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##saveStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: -1, data: {} })) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.createStrategyForm.config.metrics = ['test'] - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(22) - component.validateForm.controls['limitQuerySecond'].setValue(2) - component.validateForm.controls['limitQueryMinute'].setValue(2) - component.validateForm.controls['limitQueryHour'].setValue(2) - component.validateForm.controls['limitTrafficSecond'].setValue(2) - component.validateForm.controls['limitTrafficMinute'].setValue(2) - component.validateForm.controls['limitTrafficHour'].setValue(2) - component.responseForm.controls['statusCode'].setValue(200) - component.responseForm.controls['contentType'].setValue('test') - component.responseForm.controls['charset'].setValue('try') - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('创建失败!') - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) - - it('##backToList test', fakeAsync(() => { - // @ts-ignore - const spyBack = jest.spyOn(component.location, 'back') - expect(spyBack).not.toHaveBeenCalled() - - component.backToList() - tick(100) - expect(spyBack).toHaveBeenCalled() - })) - - it('##checkMetricOrder test', fakeAsync(() => { - component.createStrategyForm.config.metrics = ['test3', 'test2', 'test1'] - component.metricsList = [ - { label: 'test1', value: 'test1' }, - { label: 'test2', value: 'test2' }, - { label: 'test3', value: 'test3' }, - { label: 'test4', value: 'test4' } - ] - component.checkMetricOrder() - expect(component.createStrategyForm.config.metrics).toStrictEqual([ - 'test1', - 'test2', - 'test3' - ]) - })) - - it('##getContentTypeList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue( - of({ - code: 0, - data: { - options: [ - { title: 'test1', name: 'testName1' }, - { title: 'test2', name: 'testName2' }, - { title: 'test3', name: 'testName3' }, - { title: 'test4', name: 'testName4' } - ] - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.metricsList = [{ label: 't', value: 'n' }] - component.getMetricsList() - fixture.detectChanges() - - expect(component.metricsList).toStrictEqual([ - { label: 'test1', value: 'testName1' }, - { label: 'test2', value: 'testName2' }, - { label: 'test3', value: 'testName3' }, - { label: 'test4', value: 'testName4' } - ]) - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getMetricsList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getMetricsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getMetricsList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: '' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getMetricsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('获取数据失败!') - }) -}) - -describe('TrafficCreateComponent test as editPage is false', () => { - let component: TrafficCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: TrafficCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: CacheCreateComponent - } - ]) - ], - declarations: [TrafficCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(TrafficCreateComponent) - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - const spyGetMetricsList = jest.spyOn(component, 'getMetricsList') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - expect(spyGetMetricsList).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).toHaveBeenCalled() - expect(spyGetMetricsList).toHaveBeenCalledTimes(1) - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.test.ts deleted file mode 100644 index ef8b5c52f..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/traffic/create/create.component.test.ts +++ /dev/null @@ -1,189 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('traffic-create e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/serv-goverance/traffic') - await page.waitForTimeout(2000) - }) - - it('提交按钮置灰,不可提交, 添加条件按钮为primary,点击后出现弹窗', async () => { - await page.locator('button:has-text("新建策略")').click() - await expect(page.locator('button:has-text("添加条件")').isDisabled).toStrictEqual(false) - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(true) - await expect(page.locator('text=*属性名称')).toBeUndefined() - await page.locator('button:has-text("添加条件")').click() - await expect(page.locator('text=*属性名称')).not.toBeUndefined() - }) - - it('配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('text=*属性名称应用 >> svg').click() - - await page.locator('text=API').nth(1).click() - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(true) - await expect(page.locator('.ant-transfer-operation button >> nth =1').isDisabled).toStrictEqual(true) - await expect(page.locator('.ant-transfer-operation button >> nth =0').isDisabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').check() - await page.locator('input[type="checkbox"] >> nth=2').check() - await expect(page.locator('.ant-transfer-operation button >> nth =0').isDisabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(false) - - await page.locator('eo-ng-transfer-list >> nth = 1 >> input[type=checkbox] >> nth = 1').check() - await page.locator('.ant-transfer-operation button >> nth =0').click() - }) - - it('在穿梭框有目录筛选选择器的情况下, 点击选择器, 页面将出现全局消息提示', async () => { - await expect(page.locator('text=筛选成功!')).toBeUndefined() - await page.locator('eo-ng-cascader div:has-text("目录筛选")').nth(1).click() - await page.locator('li:has-text("鉴权管理")').click() - await expect(page.locator('text=筛选成功!')).not.toBeUndefined() - }) - - it('在搜索框内输入搜索内容, 页面选项将发生变化, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('nz-select-item:has-text("API")').click() - await page.locator('text=应用').nth(1).click() - await expect(page.locator('text=application_beta!')).not.toBeUndefined() - - await page.locator(' [placeholder="请输入搜索内容"]').fill('test') - await expect(page.locator('text=application_beta!')).toBeUndefined() - }) - - it('属性名称选择API路径时, 输入框未有选中值时, 保存按钮置灰, 反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('nz-select-item:has-text("应用")').click() - await page.locator('text=API路径').click() - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(true) - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('button:has-text("保存")').click() - await expect(page.locator('text=API路径')).not.toBeUndefined() - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.locator('text=*属性名称应用 >> svg').click() - await expect(page.locator('eo-ng-option-item:has-text("API路径")')).not.toBeUndefined() - await expect(page.locator('.ant-checkbox-input')).not.toBeUndefined() - await expect(page.locator('button:has-text("保存")').isDisabled).toStrictEqual(true) - - await page.locator('td:has-text("所有API请求方式")').click() - - await page.locator('.ant-checkbox-input').first().check() - }) - it('点击添加条件按钮, 点击取消或关闭时, 弹窗消失, 列表行数不变', async () => { - await expect((await page.$$('eo-ng-table tr')).length).toStrictEqual(4) - - await page.locator('button:has-text("添加条件")').click() - await page.locator('[aria-label="Close"]').click() - await page.locator('button:has-text("添加条件")').click() - await page.locator('#cdk-overlay-9 button:has-text("取消")').click() - - await expect((await page.$$('eo-ng-table tr')).length).toStrictEqual(4) - }) - - it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - await page.locator('text=配置').first().click() - await page.locator('nz-select-item:has-text("API")').click() - await page.locator('text=*属性名称API >> section').click() - await page.locator('input[type="checkbox"] >> nth=0').check() - await page.locator('.ant-transfer-operation button >> nth =1').click() - await page.locator('button:has-text("保存")').click() - - await page.locator('text=所有API').first().click() - await page.locator('text=删除').first().click() - await page.locator('div[role="document"] button:has-text("取消")').click() - - await page.locator('text=删除').first().click() - await page.locator('button:has-text("确定")').click() - await expect((await page.$$('eo-ng-table tr')).length).toStrictEqual(3) - }) - - it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // Click text=配置 >> nth=0 - await page.locator('text=配置').first().click() - // Uncheck label:nth-child(5) > .ant-checkbox > .ant-checkbox-input - await page.locator('label:nth-child(5) > .ant-checkbox > .ant-checkbox-input').uncheck() - // Check .ant-checkbox-input >> nth=0 - await page.locator('.ant-checkbox-input').first().check() - // Click button:has-text("保存") - await page.locator('button:has-text("保存")').click() - }) - - it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - await page.locator('text=配置').first().click() - await page.locator('[placeholder="请输入API路径"]').click() - await page.locator('#cdk-overlay-11 button:has-text("取消")').click() - await page.locator('text=配置').first().click() - await page.locator('[placeholder="请输入API路径"]').click() - await page.locator('[placeholder="请输入API路径"]').fill('test1') - await page.locator('button:has-text("保存")').click() - await expect(page.locator('test=test1")')).not.toBeUndefined() - }) - - it('选择限流维度, 此时提交按钮将为primary, 点击提交, 页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - // Fill text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"] - await page.locator('text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"]').fill('tet') - // Click eo-ng-traffic-create:has-text("*策略名称英文数字下划线任意一种,首字母必须为英文描述优先级*筛选条件添加条件属性名称属性值操作API请求方式所有API请求方式 配置 删除 API路径test") - await page.locator('eo-ng-traffic-create:has-text("*策略名称英文数字下划线任意一种,首字母必须为英文描述优先级*筛选条件添加条件属性名称属性值操作API请求方式所有API请求方式 配置 删除 API路径test")').click() - // Click text=[object Text] 请选择 - await page.locator('text=[object Text] 请选择').click() - // Check input[type="checkbox"] >> nth=0 - await page.locator('input[type="checkbox"]').first().check() - // Click button:has-text("提交") - await page.locator('button:has-text("提交")').click() - // Click text=创建成功! - await page.locator('text=创建成功!').click() - // Click text=tet - await page.locator('text=tet').click() - }) - it('点击新建策略按钮, 点击左侧分组的环境节点, 该环境的集群列表将收缩或展开, 页面不变; 点击左侧的集群节点, 页面变为相应集群的列表', async () => { - // Click button:has-text("新建策略") - await page.locator('button:has-text("新建策略")').click() - // Click text=英文数字下划线任意一种,首字母必须为英文 - await page.locator('text=英文数字下划线任意一种,首字母必须为英文').click() - // Click text=DEV - await page.locator('text=DEV').click() - // Click text=DEV - await page.locator('text=DEV').click() - // Click nz-tree-node-title:has-text("liu_localhost") - await page.locator('nz-tree-node-title:has-text("liu_localhost")').click() - // Click text=启停 - await page.locator('text=启停').click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - // Click button:has-text("新建策略") - await page.locator('button:has-text("新建策略")').click() - // Click text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"] - await page.locator('text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"]').click() - // Fill text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"] - await page.locator('text=*策略名称英文数字下划线任意一种,首字母必须为英文 >> [placeholder="请输入"]').fill('test') - // Click button:has-text("添加条件") - await page.locator('button:has-text("添加条件")').click() - // Click eo-ng-select-top-control:has-text("应用") - await page.locator('eo-ng-select-top-control').click() - // Click text=API路径 - await page.locator('text=API路径').click() - - await page.locator('text=API路径').click() - // Click [placeholder="请输入API路径"] - await page.locator('[placeholder="请输入API路径"]').click() - // Fill [placeholder="请输入API路径"] - await page.locator('[placeholder="请输入API路径"]').fill('test') - // Click button:has-text("保存") - await page.locator('button:has-text("保存")').click() - // Click text=[object Text] 请选择 >> input - await page.locator('text=[object Text] 请选择 >> input').click() - // Click #cdk-overlay-30 >> text=API - await page.locator('#cdk-overlay-30 >> text=API').click() - // Click button:has-text("提交") - await page.locator('button:has-text("提交")').click() - // Click text=启停 - await page.locator('text=启停').click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - }) - it('当筛选条件列表中属性值过长, 鼠标悬浮出现气泡框', async () => { - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/traffic/message/message.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/traffic/message/message.component.spec.ts deleted file mode 100644 index 5a70fdeb3..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/traffic/message/message.component.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackMessageService, EoNgFeedbackModalService } from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { LayoutModule } from 'projects/core/src/app/layout/layout.module' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('FlowControlMessageComponent test as editPage is false', () => { - let component: FlowControlMessageComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, FormsModule, EoNgSelectModule, LayoutModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: FlowControlMessageComponent - }, - { - path: 'message', - component: FlowControlMessageComponent - }, - { - path: 'create', - component: FlowControlCreateComponent - } - ] - ) - ], - declarations: [FlowControlMessageComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(FlowControlMessageComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/traffic/traffic.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/traffic/traffic.component.test.ts deleted file mode 100644 index 34a2416d7..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/traffic/traffic.component.test.ts +++ /dev/null @@ -1,458 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('服务治理-流量策略 test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - await page.locator('button:has-text("登录")').click() - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - - await page.locator('eo-ng-menu-default div:has-text("服务治理")').click() - }) - - it('保存按钮为primary,未添加数据时,点击保存按钮将出现错误提示, 添加条件按钮为primary,点击后出现弹窗', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-form-item-explain-error >> nth = 0').click() - await page.locator('.ant-form-item-explain-error >> nth = 1').click() - - const saveBtn = await page.locator('.ant-btn-primary') - const saveBtnBg = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - - await expect(saveBtnBg).toStrictEqual('rgb(34, 84, 157)') - - await page.locator('button:has-text("添加条件")').click() - }) - - it('配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('eo-ng-select#name').last().click() - - await page.locator('text=API').nth(1).click() - await page.waitForTimeout(1000) - - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - const transferBtn1 = await page.locator('.ant-transfer-operation button >> nth =0') - let transferBtn1Disabled = await transferBtn1.isDisabled() - - const transferBtn2 = await page.locator('.ant-transfer-operation button >> nth =1') - const transferBtn2Disabled = await transferBtn2.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await expect(transferBtn2Disabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').check() - - await page.locator('input[type="checkbox"] >> nth=2').check() - - transferBtn1Disabled = await transferBtn1.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(false) - - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - }) - - // it('在搜索框内输入搜索内容, 页面选项将发生变化, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - // - // await page.locator('button:has-text("添加条件")').click() - // await page.locator('eo-ng-select#name').click() - - // await page.locator('text=应用').nth(1).click() - // await page.waitForTimeout(100) - - // await page.locator(' [placeholder="请输入搜索内容"] >> nth = 1').fill('test') - // await expect(await page.locator('text=匿名应用').isVisible()).toStrictEqual(false) - // }) - - it('属性名称选择API路径时, 输入框未有值时, 保存按钮置灰, 输入值不符合正则时,保存按钮置灰,反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.locator('eo-ng-select#name').last().click() - await page.waitForTimeout(400) - await page.locator('text=API路径').click() - let tableLength = await (await page.$$('eo-ng-filter-table tr')).length - expect(tableLength).toStrictEqual(2) - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('11 11') - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - tableLength = await (await page.$$('eo-ng-filter-table tr')).length - expect(tableLength).toStrictEqual(3) - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - const saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.getByText('API请求方式').click() - await page.getByLabel('ALL').check() - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - await expect(await page.locator('eo-ng-filter-table tbody tr td:has-text("所有API请求方式")').isVisible()).toStrictEqual(true) - }) - it('点击添加条件按钮, 点击取消时, 弹窗消失, 列表行数不变', async () => { - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - await page.locator('button:has-text("添加条件")').click() - await page.waitForTimeout(400) - await page.locator('eo-ng-filter-footer .ml-btnbase').last().click() - - await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - }) - - // it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.getByRole('cell', { name: 'API' }).click() - // // await page.locator('eo-ng-filter-table tbody tr >> nth = 0 >> td >> nth =2 >> button >> nth = 0').first().click() - // await page.waitForTimeout(2000) - - // await page.locator('input[type="checkbox"] >> nth=0').click() - // await page.locator('.ant-transfer-operation button >> nth =1').click() - // await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - - // await page.locator('.icon-shanchu >> nth = 2').click() - // await page.locator('.nz-modal-footer button:has-text("取消")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - - // await page.locator('.icon-shanchu >> nth = 1').click() - // await page.locator('.nz-modal-footer button:has-text("确定")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - // }) - - // it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // await page.locator('.icon-a-peizhianniu_huaban1 >> nth = 1').click() - // await page.getByLabel('DELETE').uncheck() - // await page.getByLabel('ALL').check() - // // Click button:has-text("保存") - // await page.locator('eo-ng-filter-footer .ant-btn-primary:has-text("提交")').click() - // }) - - // it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('[placeholder="请输入API路径"]').fill('test1') - // await page.locator('eo-ng-filter-footer button:has-text("提交")').click() - // await page.getByRole('cell', { name: 'test1' }).click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - // }) - - it('点击添加条件,选择ip地址,当输入的不符合正则时,出现错误提示且无法提交', async () => { - await page.getByRole('button', { name: '添加条件' }).click() - await page.locator('eo-ng-select#name').last().click() - await page.getByText('IP').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111') - await page.getByText('输入的IP或CIDR不符合格式').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111.111.111') - await page.locator('eo-ng-filter-footer:has-text("保存 取消")').getByRole('button', { name: '保存' }).click() - }) - - it('清空所有必输项,点击保存,页面不变;逐一填写必输项,直至填写完毕,点击保存,页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - await page.getByText('*每秒限流数').click() - await page.locator('input[name="query\\.second"]').click() - await page.locator('input[name="query\\.second"]').fill('') - await page.getByText('*限流维度[object Text] 请选择 必填项*每秒限流数必填项*每分限流数*每小时限流数*每秒限报文总量 MB*每分限报文总量MB*每小时限报文总量 M').click() - await page.locator('input[name="query\\.minute"]').click() - await page.locator('input[name="query\\.minute"]').fill('') - await page.locator('input[name="query\\.hour"]').click() - await page.locator('input[name="query\\.hour"]').fill('') - await page.locator('input[name="traffic\\.second"]').click() - await page.locator('input[name="traffic\\.second"]').fill('') - await page.locator('eo-ng-input-group:has-text("MB")').nth(1).click() - await page.locator('input[name="traffic\\.minute"]').click() - await page.locator('input[name="traffic\\.minute"]').fill('') - await page.locator('input[name="traffic\\.hour"]').click() - await page.locator('input[name="traffic\\.hour"]').fill('') - await page.locator('eo-ng-response-form:has-text("*HTTP状态码*Content-Typeapplication/json* CharsetUTF-8Header参数Body") input[type="number"]').click() - await page.locator('eo-ng-response-form:has-text("*HTTP状态码*Content-Typeapplication/json* CharsetUTF-8Header参数Body") input[type="number"]').fill('') - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').fill('testForE2e') - await page.getByRole('button', { name: '保存' }).click() - await page.getByText('[object Text] 请选择').click() - await page.locator('eo-ng-option-item:has-text("应用")').click() - await page.locator('eo-ng-option-item:has-text("API")').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="query\\.second"]').click() - await page.locator('input[name="query\\.second"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="query\\.minute"]').click() - await page.locator('input[name="query\\.minute"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="query\\.hour"]').click() - await page.locator('input[name="query\\.hour"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="traffic\\.second"]').click() - await page.locator('input[name="traffic\\.second"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="traffic\\.minute"]').click() - await page.locator('input[name="traffic\\.minute"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('input[name="traffic\\.hour"]').click() - await page.locator('input[name="traffic\\.hour"]').fill('1') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-response-form:has-text("*HTTP状态码必填项*Content-Typeapplication/json* CharsetUTF-8Header参数Body") input[type="number"]').click() - await page.locator('eo-ng-response-form:has-text("*HTTP状态码必填项*Content-Typeapplication/json* CharsetUTF-8Header参数Body") input[type="number"]').fill('100') - await page.getByText('application/json').click() - - await page.getByText('*Content-Type').click() - await page.getByText('UTF-8').click() - await page.getByText('GBK').click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('div:has-text("success")').nth(3).click() - - // const tableLength = await (await page.$$('eo-ng-apinto-table tr')).length - // await page.locator('eo-ng-apinto-table tr >> nth = ' + (tableLength - 1) + '>> td >> nth = 8 >> button >> nth = 1').click() - // await page.getByRole('button', { name: '确定' }).click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - await page.getByRole('cell', { name: 'testForE2e' }).last().click() - await page.getByText('流量策略 / testForE2e /').click() - await page.getByRole('button', { name: '提交' }).click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - const priorityInput = await page.locator('input#priority') - const priorityInputW = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const priorityInputH = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(priorityInputW).toStrictEqual('346px') - await expect(priorityInputH).toStrictEqual('32px') - - const metricInput = await page.locator('eo-ng-select#metrics') - const metricInputW = await metricInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const metricInputnH = await metricInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(metricInputW).toStrictEqual('346px') - await expect(metricInputnH).toStrictEqual('32px') - - const querySecondInput = await page.locator('[id="query\\.second"]') - const querySecondInputW = await querySecondInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const querySecondInputH = await querySecondInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(querySecondInputW).toStrictEqual('346px') - await expect(querySecondInputH).toStrictEqual('32px') - - const queryMinuteInput = await page.locator('[id="query\\.minute"]') - const queryMinuteInputW = await queryMinuteInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const queryMinuteInputH = await queryMinuteInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(queryMinuteInputW).toStrictEqual('346px') - await expect(queryMinuteInputH).toStrictEqual('32px') - - const queryHourInput = await page.locator('[id="query\\.hour"]') - const queryHourInputW = await queryHourInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const queryHourInputH = await queryHourInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(queryHourInputW).toStrictEqual('346px') - await expect(queryHourInputH).toStrictEqual('32px') - - const trafficSecondInput = await page.locator('eo-ng-input-group:has-text("MB") >> nth=0') - const trafficSecondInputW = await trafficSecondInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const trafficSecondInputH = await trafficSecondInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(trafficSecondInputW).toStrictEqual('346px') - await expect(trafficSecondInputH).toStrictEqual('32px') - - const trafficMinuteInput = await page.locator('eo-ng-input-group:has-text("MB") >> nth=1') - const trafficMinuteInputW = await trafficMinuteInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const trafficMinuteInputH = await trafficMinuteInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(trafficMinuteInputW).toStrictEqual('346px') - await expect(trafficMinuteInputH).toStrictEqual('32px') - - const trafficHourInput = await page.locator('eo-ng-input-group:has-text("MB") >> nth=2') - const trafficHourInputW = await trafficHourInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const trafficHourInputH = await trafficHourInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(trafficHourInputW).toStrictEqual('346px') - await expect(trafficHourInputH).toStrictEqual('32px') - - const httpStatusInput = await page.locator('eo-ng-response-form').getByRole('spinbutton') - const httpStatusInputW = await httpStatusInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const httpStatusInputH = await httpStatusInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(httpStatusInputW).toStrictEqual('346px') - await expect(httpStatusInputH).toStrictEqual('32px') - - const contentTypeInput = await page.locator('eo-ng-select-top-control').filter({ hasText: 'application/json' }) - const contentTypeInputW = await contentTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const contentTypeInputH = await contentTypeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(contentTypeInputW).toStrictEqual('346px') - await expect(contentTypeInputH).toStrictEqual('32px') - - const charsetInput = await page.locator('eo-ng-select-top-control').filter({ hasText: 'UTF-8' }) - const charsetInputW = await charsetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const charsetInputH = await charsetInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(charsetInputW).toStrictEqual('346px') - await expect(charsetInputH).toStrictEqual('32px') - - const headerFirstInput1 = await page.getByRole('cell', { name: '请输入Key' }) - const headerFirstInput1W = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1H = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1W).toStrictEqual('182px') - await expect(headerFirstInput1PR).toStrictEqual('8px') - await expect(headerFirstInput1H).toStrictEqual('32px') - - const headerFirstInput2 = await page.getByRole('cell', { name: '请输入Value' }) - const headerFirstInput2W = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput2PR = await headerFirstInput1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput2H = await headerFirstInput2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput2W).toStrictEqual('172px') - await expect(headerFirstInput2PR).toStrictEqual('8px') - await expect(headerFirstInput2H).toStrictEqual('32px') - - const headerFirstBtn = await page.getByRole('row', { name: '请输入Key 请输入Value ' }).getByRole('button', { name: '' }) - const headerFirstBtnH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerFirstBtnLH = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerFirstBtnColor = await headerFirstBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerFirstBtnH).toStrictEqual('32px') - await expect(headerFirstBtnLH).toStrictEqual('32px') - await expect(headerFirstBtnColor).toStrictEqual('rgb(34, 84, 157)') - - await page.getByRole('button', { name: '' }).click() - - const headerFirstInput1A = await page.locator('eo-ng-apinto-table.arrayItem tr >> nth = 1 >> td >> nth = 0') - const headerFirstInput1AW = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const headerFirstInput1APR = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - const headerFirstInput1APB = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - const headerFirstInput1AH = await headerFirstInput1A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(headerFirstInput1AW).toStrictEqual('182px') - await expect(headerFirstInput1APR).toStrictEqual('8px') - await expect(headerFirstInput1APB).toStrictEqual('12px') - await expect(headerFirstInput1AH).toStrictEqual('44px') - - const headerSecondBtn = await page.locator('eo-ng-apinto-table.arrayItem tr >> nth = 2 >> td >> nth = 2 >> button >> nth = 0') - const headerSecondBtnH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const headerSecondBtnLH = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const headerSecondBtnColor = await headerSecondBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(headerSecondBtnH).toStrictEqual('32px') - await expect(headerSecondBtnLH).toStrictEqual('32px') - await expect(headerSecondBtnColor).toStrictEqual('rgb(34, 84, 157)') - - const bodyInput = await page.locator('eo-ng-response-form nz-form-item').filter({ hasText: 'Body' }).getByPlaceholder('请输入') - const bodyInputW = await bodyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const bodyInputH = await bodyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(bodyInputW).toStrictEqual('346px') - await expect(bodyInputH).toStrictEqual('32px') - - const limitSection1 = await page.locator('section.limit-bg >> nth = 0') - const limitSection1BG = await limitSection1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const limitSection1P = await limitSection1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - await expect(limitSection1BG).toStrictEqual('rgb(248, 248, 250)') - await expect(limitSection1P).toStrictEqual('20px') - - const limitSection2 = await page.locator('section.limit-bg >> nth = 1') - const limitSection2BG = await limitSection2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const limitSection2P = await limitSection2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - - await expect(limitSection2BG).toStrictEqual('rgb(248, 248, 250)') - await expect(limitSection2P).toStrictEqual('20px') - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/visit/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/serv-governance/visit/create/create.component.spec.ts deleted file mode 100644 index 081d43b48..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/visit/create/create.component.spec.ts +++ /dev/null @@ -1,533 +0,0 @@ -/* eslint-disable dot-notation */ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { ActivatedRoute, RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { - EoNgFeedbackMessageService, - EoNgFeedbackModalService -} from 'eo-ng-feedback' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' - -import { EoNgSelectModule } from 'eo-ng-select' -import { FuseCreateComponent } from '../../fuse/create/create.component' -import { GreyCreateComponent } from '../../grey/create/create.component' -import { VisitCreateComponent } from './create.component' -import { EoNgSwitchModule } from 'eo-ng-switch' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('VisitCreateComponent test as editPage is false', () => { - let component: VisitCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - HttpClientModule, - EoNgSwitchModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: VisitCreateComponent - } - ]) - ], - declarations: [VisitCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef }, - { - provide: ActivatedRoute, - useValue: { - queryParams: of({ clusterName: 'clus2', strategy_uuid: 'uuid' }) - } - } - ] - }).compileComponents() - - fixture = TestBed.createComponent(VisitCreateComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - it('##should create', () => { - expect(component).toBeTruthy() - }) - - it('##ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - }) - - it('##ngOnChanges test', () => { - component.strategyUuid = '' - component.createStrategyForm.uuid = '1' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('1') - - component.strategyUuid = '123' - component.ngOnChanges() - expect(component.createStrategyForm.uuid).toStrictEqual('123') - }) - - it('##getStrategyMessage with success return (without optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const mockValue1: any = { - code: 0, - data: { - strategy: { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - config: { - visitRule: 'allow', - continue: false - } - } - } - } - - const expectCreateStrategyForm: any = { - name: 'default_value', - uuid: 'default_value', - desc: 'default_value', - priority: '', - filters: [], - config: { - visitRule: 'allow', - continue: false, - influenceSphere: [] - } - } - - const expValidateForm: any = { - name: 'default_value', - desc: 'default_value', - priority: null, - continue: false - } - - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue1)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - - expect(component.createStrategyForm).toStrictEqual(expectCreateStrategyForm) - expect(component.validateForm.value).toStrictEqual(expValidateForm) - expect(component.filterNamesSet).toStrictEqual(new Set()) - expect(component.filterShowList).toStrictEqual([]) - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##getStrategyMessage with success return (with optional attr)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - - const mockValue2: any = { - code: 0, - data: { - strategy: { - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - visitRule: 'allow', - influenceSphere: [{ name: 'testG', uuid: '12321' }], - continue: false - } - } - } - } - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of(mockValue2)) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.filterNamesSet = new Set() - component.filterShowList = [] - component.getStrategyMessage() - fixture.detectChanges() - - expect(component.createStrategyForm).toStrictEqual({ - name: 'testName', - uuid: 'testUuid', - desc: 'testDesc', - priority: 5, - filters: [{ name: 'testF', uuid: '123' }], - config: { - visitRule: 'allow', - influenceSphere: [{ name: 'testG', uuid: '12321' }], - continue: false - } - }) - expect(component.filterNamesSet).toStrictEqual(new Set(['testF', 'testG'])) - expect(component.filterShowList).toStrictEqual([ - { name: 'testF', uuid: '123' } - ]) - expect(component.influenceShowList).toStrictEqual([ - { name: 'testG', uuid: '12321' } - ]) - expect(spyService).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1, msg: 'fail' })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - }) - - it('##getStrategyMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest - .spyOn(httpCommonService, 'get') - .mockReturnValue(of({ code: -1 })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyService).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.getStrategyMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalledWith('获取数据失败!') - }) - - it('##disabledEdit test', fakeAsync(() => { - component.nzDisabled = false - component.disabledEdit(true) - expect(component.nzDisabled).toStrictEqual(true) - })) - - it('##saveStrategy with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue( - of({ - code: 0, - data: { - } - }) - ) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyBackToList = jest.spyOn(component, 'backToList') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - component.filterShowList = [{ title: 'test1', label: 'test1', name: 'test1', values: [''] }, { title: 'test2', label: 'test2', name: 'test2', values: [''] }, { title: 'test3', label: 'test3', name: 'test3', values: [] }] - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(2222) - component.validateForm.controls['continue'].setValue(false) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['continue'].setValue(false) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['continue'].setValue(null) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(222) - component.validateForm.controls['continue'].setValue(false) - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyBackToList).toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).toBeCalledWith('创建成功!') - - expect(component.createStrategyForm.filters).toStrictEqual([ - { name: 'test1', values: [''] }, - { name: 'test2', values: [''] }, - { name: 'test3', values: [] } - ]) - - component.editPage = true - component.validateForm.controls['priority'].setValue(null) - component.createStrategyForm.config.visitRule = '' - component.saveStrategy() - fixture.detectChanges() - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyBackToList).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('##saveStrategy with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePut = jest - .spyOn(httpCommonService, 'put') - .mockReturnValue(of({ code: -1, data: {} })) - const spyServicePost = jest - .spyOn(httpCommonService, 'post') - .mockReturnValue(of({ code: -1, data: {} })) - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyServicePost).not.toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).not.toHaveBeenCalled() - - component.validateForm.controls['name'].setValue('test') - component.validateForm.controls['priority'].setValue(22) - component.validateForm.controls['continue'].setValue(false) - - component.editPage = false - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalled() - expect(spyServicePut).not.toHaveBeenCalled() - expect(spyMessage).toHaveBeenCalled() - expect(spyMessage).toBeCalledWith('创建失败!') - - component.editPage = true - component.saveStrategy() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) - - it('##backToList test', fakeAsync(() => { - // @ts-ignore - const spyBack = jest.spyOn(component.location, 'back') - expect(spyBack).not.toHaveBeenCalled() - - component.backToList() - tick(100) - expect(spyBack).toHaveBeenCalled() - })) -}) - -describe('VisitCreateComponent test as editPage is false', () => { - let component: VisitCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { - super(null) - } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - FormsModule, - ReactiveFormsModule, - EoNgSelectModule, - BidiModule, - NoopAnimationsModule, - NzNoAnimationModule, - NzDrawerModule, - NzOutletModule, - EoNgSwitchModule, - HttpClientModule, - RouterModule.forRoot([ - { - path: 'serv-governance/traffic/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/fuse/create', - component: FuseCreateComponent - }, - { - path: 'serv-governance/grey/create', - component: GreyCreateComponent - }, - { - path: 'serv-governance/visit/create', - component: VisitCreateComponent - }, - { - path: 'serv-governance/cache/create', - component: VisitCreateComponent - } - ]) - ], - declarations: [VisitCreateComponent], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(VisitCreateComponent) - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call getStrategyMessage()', () => { - const spyGetStrategyMessage = jest.spyOn(component, 'getStrategyMessage') - expect(spyGetStrategyMessage).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetStrategyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/serv-governance/visit/visit.component.test.ts b/frontend/projects/core/src/app/layout/serv-governance/visit/visit.component.test.ts deleted file mode 100644 index 81f564fdb..000000000 --- a/frontend/projects/core/src/app/layout/serv-governance/visit/visit.component.test.ts +++ /dev/null @@ -1,291 +0,0 @@ -// 创建和编辑流量策略表单页 -// -穿梭框改成虚拟 -describe('服务治理-访问策略 e2e test', () => { - it('初始化页面, 默认第一个环境列表中的第一个集群被选中,列表页显示数据, 点击新建按钮, 进入新建策略页', async () => { - // Go to http://localhost:4200/serv-goverance/traffic - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - - await page.locator('[placeholder="请输入账号"]').fill('maggie') - // Click [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').click() - // Fill [placeholder="请输入密码"] - await page.locator('[placeholder="请输入密码"]').fill('12345678') - await page.locator('button:has-text("登录")').click() - await page.locator('#cdk-overlay-0 div:has-text("登录成功")').nth(3).click() - - await page.locator('eo-ng-menu-default div:has-text("服务治理")').click() - await page.getByRole('link', { name: '访问策略' }).click() - }) - - it('保存按钮为primary,未添加数据时,点击保存按钮将出现错误提示 ', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.locator('.ant-form-item-explain-error >> nth = 0').click() - }) - - it('添加条件按钮为primary,点击后出现弹窗,配置筛选条件弹窗中, 选择API时, 右侧穿梭框无选项时,保存按钮置灰, 页面出现穿梭框, 穿梭按钮置灰, 在左侧穿梭框勾选其中两个选项, 穿梭至右侧的按钮将变为可点击状态, 至左侧按钮仍置灰, 点击后该选项进入右侧穿梭框, 左侧穿梭框找不到该选项, 穿梭按钮置灰', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.locator('eo-ng-select#name').last().click() - - await page.locator('text=API').nth(1).click() - await page.waitForTimeout(200) - - await expect(page.locator('nz-empty-simple svg')).not.toBeUndefined() - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - const transferBtn1 = await page.locator('.ant-transfer-operation button >> nth =0') - let transferBtn1Disabled = await transferBtn1.isDisabled() - - const transferBtn2 = await page.locator('.ant-transfer-operation button >> nth =1') - const transferBtn2Disabled = await transferBtn2.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await expect(transferBtn2Disabled).toStrictEqual(true) - - await page.locator('input[type="checkbox"] >> nth=1').click() - await page.locator('input[type="checkbox"] >> nth=2').click() - transferBtn1Disabled = await transferBtn1.isDisabled() - - await expect(transferBtn1Disabled).toStrictEqual(true) - await page.locator('.ant-transfer-operation button >> nth =1').click() - - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(false) - - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - }) - - // it('在搜索框内输入搜索内容, 页面选项将发生变化, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - // - // await page.locator('button:has-text("添加条件")').click() - // await page.locator('eo-ng-select#name').click() - - // await page.locator('text=应用').nth(1).click() - // await page.waitForTimeout(100) - - // await page.locator(' [placeholder="请输入搜索内容"] >> nth = 1').fill('test') - // await expect(await page.locator('text=匿名应用').isVisible()).toStrictEqual(false) - // }) - - it('属性名称选择API路径时, 输入框未有值时, 保存按钮置灰, 输入值不符合正则时,保存按钮置灰,反之为primary, 点击保存将关闭弹窗, 添加条件列表中将新增一行', async () => { - await page.locator('button:has-text("添加条件")').last().click() - await page.locator('eo-ng-select#name').last().click() - await page.waitForTimeout(400) - await page.locator('text=API路径').click() - const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - - const saveBtn = await page.locator('eo-ng-filter-footer .ant-btn-primary') - let saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('11 11') - saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.locator('[placeholder="请输入API路径"]').fill('test') - await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - expect(await (await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength + 1) - }) - it('点击添加条件按钮, 属性名称中不会出现API路径, 属性名称选择API请求方式时, 页面的输入框将变为一组checkbox, 当checkbox未被选中时,保存按钮置灰, 反之为primary, 点击保存将关闭弹窗 ', async () => { - await page.locator('button:has-text("添加条件")').first().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - - const saveBtn = await page.locator('eo-ng-filter-footer >> nth = 0 >> .ant-btn-primary') - const saveBtnDisabled = await saveBtn.isDisabled() - await expect(saveBtnDisabled).toStrictEqual(true) - - await page.getByText('API请求方式').click() - await page.getByLabel('ALL').check() - await page.locator('eo-ng-filter-footer >> nth = 0 >>.ant-btn-primary').click() - await expect(await page.locator('eo-ng-filter-table >> nth = 0 >> tbody tr td:has-text("所有API请求方式")').isVisible()).toStrictEqual(true) - }) - it('点击添加条件按钮, 之前选择过的属性不会出现在列表中 点击取消时, 弹窗消失, 列表行数不变', async () => { - const tableLength = await (await page.$$('eo-ng-filter-table >> nth = 1 >> tr')).length - - await page.locator('button:has-text("添加条件")').last().click() - await page.waitForTimeout(400) - await page.locator('eo-ng-select#name').last().click() - await expect(await page.locator('eo-ng-option-item:has-text("API路径")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API请求方式")').isVisible()).toStrictEqual(false) - await expect(await page.locator('eo-ng-option-item:has-text("API")').isVisible()).toStrictEqual(false) - await page.locator('eo-ng-filter-footer .ml-btnbase').last().click() - - await expect((await page.$$('eo-ng-filter-table >> nth = 1 >> tr')).length).toStrictEqual(tableLength) - }) - - // it('点击列表第一列(API)中的配置, 弹窗中属性名称与列表中的属性名相同, 且穿梭框右侧有值, 全选左侧穿梭框并点击穿梭按钮, 提交后, 该列的属性值将变为全部API, 点击删除, 出现删除弹窗, 点击取消, 弹窗消失, 再次点击删除, 出现删除弹窗, 点击确认后, 弹窗关闭, 列表中该列将消失', async () => { - // const tableLength = await (await page.$$('eo-ng-filter-table tr')).length - // await page.getByRole('cell', { name: 'API' }).click() - // // await page.locator('eo-ng-filter-table tbody tr >> nth = 0 >> td >> nth =2 >> button >> nth = 0').first().click() - // await page.waitForTimeout(2000) - - // await page.locator('input[type="checkbox"] >> nth=0').click() - // await page.locator('.ant-transfer-operation button >> nth =1').click() - // await page.locator('eo-ng-filter-footer .ant-btn-primary').click() - - // await page.locator('.icon-shanchu >> nth = 2').click() - // await page.locator('.nz-modal-footer button:has-text("取消")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength) - - // await page.locator('.icon-shanchu >> nth = 1').click() - // await page.locator('.nz-modal-footer button:has-text("确定")').click() - // await expect((await page.$$('eo-ng-filter-table tr')).length).toStrictEqual(tableLength - 1) - // }) - - // it('点击列表第二列(API请求方式)的配置, 弹窗中的checkbox中有部分被勾选, 点击ALL选项则全部checkbox被勾选, 提交后, 该列的属性值将变为全部请求方式', async () => { - // await page.locator('.icon-a-peizhianniu_huaban1 >> nth = 1').click() - // await page.getByLabel('DELETE').uncheck() - // await page.getByLabel('ALL').check() - // // Click button:has-text("保存") - // await page.locator('eo-ng-filter-footer .ant-btn-primary:has-text("提交")').click() - // }) - - // it('点击列表第一列(API路径)的配置, 弹窗中的输入框内值与列表中的属性值相同, 编辑输入框, 点击取消, 弹窗消失后列表内容不变, 再次点击配置, 改变输入框内容后提交, 弹窗消失后列表内容发生相应变化', async () => { - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - - // await page.getByRole('cell', { name: 'API路径' }).click() - // await page.locator('[placeholder="请输入API路径"]').click() - // await page.locator('[placeholder="请输入API路径"]').fill('test1') - // await page.locator('eo-ng-filter-footer button:has-text("提交")').click() - // await page.getByRole('cell', { name: 'test1' }).click() - // await page.locator('eo-ng-filter-footer button:has-text("取消")').click() - // }) - - it('点击添加条件,选择ip地址,当输入的不符合正则时,出现错误提示且无法提交', async () => { - await page.getByRole('button', { name: '添加条件' }).first().click() - await page.locator('eo-ng-select#name').last().click() - await page.getByText('IP').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111') - await page.getByText('输入的IP或CIDR不符合格式').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').click() - await page.getByPlaceholder('请输入IP地址或CIDR范围,每条以换行分割').fill('111.111.111.111') - await page.locator('eo-ng-filter-footer:has-text("保存 取消")').getByRole('button', { name: '保存' }).click() - }) - - it('填写所有必填项,点击保存,页面出现消息提示, 当消息提示为成功时, 页面返回列表页, 否则停留本页', async () => { - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - await page.getByText('必填项').click() - await page.getByPlaceholder('请输入首字母为英文,英文数字下划线任意一种组合').fill('testForE2e') - await page.locator('eo-ng-select').getByText('允许').click() - await page.locator('eo-ng-option-item').filter({ hasText: '拒绝' }).click() - await page.getByRole('button', { name: '否' }).click() - await page.locator('.fix-buttom-group').getByRole('button', { name: '保存' }).click() - - await page.getByText('success').click() - }) - - it('点击列表中的查看按钮, 策略名称&筛选条件列表&限流规则不为空, 保存按钮为primary, 点击保存出现全局消息提示, 并返回列表页', async () => { - await page.getByRole('cell', { name: 'testForE2e' }).last().click() - await page.getByText('访问策略 / testForE2e /').click() - await page.getByRole('button', { name: '提交' }).click() - }) - - it('输入框大小, 按钮的大小和颜色, 表格的大小, 限流规则的背景色', async () => { - await page.getByRole('button', { name: '新建策略' }).click() - - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - const priorityInput = await page.locator('input#priority') - const priorityInputW = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const priorityInputH = await priorityInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(priorityInputW).toStrictEqual('346px') - await expect(priorityInputH).toStrictEqual('32px') - - const visitRuleInput = await page.locator('eo-ng-select') - const visitRuleInputW = await visitRuleInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const visitRuleInputH = await visitRuleInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(visitRuleInputW).toStrictEqual('346px') - await expect(visitRuleInputH).toStrictEqual('32px') - - const filterBtn1 = await page.locator('nz-form-item').filter({ hasText: '筛选流量 添加条件' }).getByRole('button', { name: '添加条件' }).first() - const filterBtn1W = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn1H = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn1BGC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - let filterBtn1BC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - let filterBtn1C = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn1W).toStrictEqual('82px') - await expect(filterBtn1H).toStrictEqual('32px') - await expect(filterBtn1BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn1BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn1C).toStrictEqual('rgba(0, 0, 0, 0.85)') - filterBtn1.hover() - filterBtn1BC = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - await expect(filterBtn1BC).toStrictEqual('rgb(34, 84, 157)') - filterBtn1C = await filterBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - await expect(filterBtn1C).toStrictEqual('rgb(34, 84, 157)') - - const filterBtn2 = await page.locator('nz-form-item').filter({ hasText: '筛选流量 添加条件' }).getByRole('button', { name: '添加条件' }).last() - const filterBtn2W = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const filterBtn2H = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const filterBtn2BGC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - let filterBtn2BC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - let filterBtn2C = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - await expect(filterBtn2W).toStrictEqual('82px') - await expect(filterBtn2H).toStrictEqual('32px') - await expect(filterBtn2BGC).toStrictEqual('rgb(255, 255, 255)') - await expect(filterBtn2BC).toStrictEqual('rgb(217, 217, 217)') - await expect(filterBtn2C).toStrictEqual('rgb(217, 217, 217)') - filterBtn2.hover() - filterBtn2BC = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - await expect(filterBtn2BC).toStrictEqual('rgb(34, 84, 157)') - filterBtn2C = await filterBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - await expect(filterBtn2C).toStrictEqual('rgb(34, 84, 157)') - - const continueSwitch = await page.locator('eo-ng-switch >> button') - const continueSwitchW = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const continueSwitchH = await continueSwitch.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(continueSwitchW).toStrictEqual('35px') - await expect(continueSwitchH).toStrictEqual('16px') - }) -}) diff --git a/frontend/projects/core/src/app/layout/system/external-app/external-app.component.test.ts b/frontend/projects/core/src/app/layout/system/external-app/external-app.component.test.ts deleted file mode 100644 index 58639eaef..000000000 --- a/frontend/projects/core/src/app/layout/system/external-app/external-app.component.test.ts +++ /dev/null @@ -1,270 +0,0 @@ -describe('系统管理 e2e test', () => { - it('初始化页面,点击系统管理-外部应用菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.locator('eo-ng-menu-default').getByText('系统管理').click() - await page.locator('eo-ng-menu-default').getByRole('link', { name: '外部应用' }).click() - }) - it('面包屑API管理,字号14,字体颜色为主题色,与左侧距离12px,垂直居中;按钮样式;表格样式', async () => { - // 面包屑样式 面包屑API管理,字号14,字体颜色为主题色,与左侧距离12px,垂直居中 - const headerBlock = await page.locator('.block_rl') - const headerBlockAI = await headerBlock.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('align-items')) - expect(headerBlockAI).toStrictEqual('center') - - const breadcrumbItem = await page.locator('nz-breadcrumb-item').getByText('外部应用') - const breadcrumbItemFS = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - expect(breadcrumbItemFS).toStrictEqual('14px') - const breadcrumbItemC = await breadcrumbItem.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(breadcrumbItemC).toStrictEqual('rgb(34, 84, 157)') - - // 新建应用的按钮样式 - const createBtn = await page.getByRole('button', { name: '新建应用' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.getByRole('columnheader', { name: '应用名称' }) - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.getByRole('columnheader', { name: '应用ID' }) - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 7 ') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 7 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 7 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('8px') - - const listTableIcon3 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 7 >> button').last() - const listTableIcon3PL = await listTableIcon3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon3PR = await listTableIcon3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon3PL).toStrictEqual('8px') - expect(listTableIcon3PR).toStrictEqual('0px') - }) - it('点击新建应用,检查样式和面包屑;点击保存,清空应用ID;逐项填入数据项,提交成功;点击新建应用,点击取消,返回列表页', async () => { - await page.getByRole('button', { name: '新建应用' }).click() - - // 应用名称输入框样式 - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 应用ID输入框样式 - const idInput = await page.locator('input#id') - const idInputW = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const idInputH = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(idInputW).toStrictEqual('346px') - await expect(idInputH).toStrictEqual('32px') - - // 描述样式 - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 表单间距 - const formItem0 = await page.locator('nz-form-item >> nth = 0') - const formItem0MB = await formItem0.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - await expect(formItem0MB).toStrictEqual('20px') - - const formItem1 = await page.locator('nz-form-item >> nth = 1') - const formItem1MB = await formItem1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - await expect(formItem1MB).toStrictEqual('20px') - - const formItem2 = await page.locator('nz-form-item >> nth = 2') - const formItem2MB = await formItem2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-bottom')) - await expect(formItem2MB).toStrictEqual('0px') - - const formItem3 = await page.locator('nz-form-item >> nth = 3') - const formItem3P = await formItem3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('PADDING')) - await expect(formItem3P).toStrictEqual('20px 0px') - - // 保存按钮样式 - const saveBtn = await page.getByRole('button', { name: '保存' }) - const saveBtnH = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const saveBtnW = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const saveBtnBG = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const saveBtnBC = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const saveBtnFS = await saveBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - - expect(saveBtnH).toStrictEqual('32px') - expect(saveBtnW).toStrictEqual('54px') - expect(saveBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(saveBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(saveBtnFS).toStrictEqual('14px') - - // 取消按钮样式 - const cancleBtn = await page.getByRole('button', { name: '取消' }) - const cancleBtnH = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const cancleBtnW = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const cancleBtnBG = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const cancleBtnBC = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const cancleBtnFS = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const cancleBtnML = await cancleBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(cancleBtnH).toStrictEqual('32px') - expect(cancleBtnW).toStrictEqual('54px') - expect(cancleBtnBG).toStrictEqual('rgb(255, 255, 255)') - expect(cancleBtnBC).toStrictEqual('rgb(217, 217, 217)') - expect(cancleBtnFS).toStrictEqual('14px') - expect(cancleBtnML).toStrictEqual('12px') - - // 验证操作 - await page.getByText('应用ID').click() - const randomId:string = await page.locator('#id').inputValue() - await page.locator('#id').click() - await page.locator('#id').fill('') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-form-item').filter({ hasText: '应用名称必填项' }).getByRole('alert').click() - await page.locator('nz-form-item').filter({ hasText: '应用ID必填项' }).getByRole('alert').click() - await page.locator('#name').click() - await page.locator('#name').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('#id').click() - await page.locator('#id').fill(randomId) - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('button', { name: '新建应用' }).click() - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击表格中某一栏,进入编辑页面,检查面包屑和应用ID禁用;修改ID,点击提交,返回列表页', async () => { - await page.waitForTimeout(700) - - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 0').click() - - // 检查面包屑 - await page.getByText('外部应用 / 外部应用详情 /').click() - - const breadcrumb1 = await page.locator('nz-breadcrumb-item').filter({ hasText: '外部应用 /' }).locator('a') - const breadcrumb1C = await breadcrumb1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - - const breadcrumb2 = await page.getByText('外部应用详情') - const breadcrumb2C = await breadcrumb2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - expect(breadcrumb1C).toStrictEqual('rgb(153, 153, 153)') - expect(breadcrumb2C).toStrictEqual('rgb(34, 84, 157)') - - // 应用ID输入框样式 - const idInput = await page.locator('input#id') - const idInputDisabled = await idInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(idInputDisabled).toStrictEqual('') - - // 修改名称、描述并提交 - await page.locator('#name').click() - await page.locator('#name').fill('test11') - await page.locator('#desc').click() - await page.locator('#desc').fill('testdesc1') - await page.getByRole('button', { name: '提交' }).click() - }) - it('点击表格中某一栏的查看图标,点击取消,返回列表页', async () => { - await page.waitForTimeout(700) - // await page.locator('eo-ng-apinto-table tr >> nth =2 >> td >> nth = 7 >> button >> nth = 1').click() - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 0').click() - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击禁用开关,出现消息弹窗;点击刷新token,出现消息弹窗;点击复制token,出现成功复制token;点击删除,测试删除弹窗', async () => { - await page.locator('eo-ng-switch >> nth = 0').click() - await page.locator('.ant-message').click() - - // await page.locator('eo-ng-apinto-table tr >> nth =2 >> td >> nth = 7 >> button >> nth = 0').click() - // await page.locator('.ant-message').click() - - // await page.locator('eo-ng-apinto-table tr >> nth =2 >> td >> nth = 7 >> button >> nth = 1').click() - // await page.locator('.ant-message').click() - - // const tableLength = await (await page.$$('eo-ng-apinto-table tr')).length - // await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 7 >> button >> nth = 3').click() - // await page.getByRole('button', { name: '确定' }).click() - // expect(await (await page.$$('eo-ng-apinto-table tr')).length).toStrictEqual(tableLength - 1) - // const tableLength = await (await page.$$('eo-ng-apinto-table tr')).length - // await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 7 >> button >> nth = 3').click() - // await page.getByRole('button', { name: '取消' }).click() - // expect(await (await page.$$('eo-ng-apinto-table tr')).length).toStrictEqual(tableLength) - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/content/content.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/content/content.component.spec.ts deleted file mode 100644 index c1b8bbf30..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/content/content.component.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-14 22:56:33 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-14 23:02:19 - * @FilePath: /apinto/src/app/layout/upstream/service-discovery-content/service-discovery-content.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, Type } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { ServiceDiscoveryContentComponent } from './content.component' -import { ServiceDiscoveryPublishComponent } from '../publish/publish.component' -import { ServiceDiscoveryMessageComponent } from '../message/message.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -describe('ServiceDiscoveryContentComponent test', () => { - let component: ServiceDiscoveryContentComponent - let fixture: ComponentFixture - let renderer2: Renderer2 - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryContentComponent) - renderer2 = fixture.componentRef.injector.get(Renderer2 as Type) - renderer2.removeAttribute = jest.fn().mockRejectedValue('remove') - - component = fixture.componentInstance - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial clusterDesc and tabOptions, remove hidden attribute from tabs', fakeAsync(() => { - expect(component.serviceName).not.toBeNull() - expect(component.tabOptions).not.toBe([]) - // fixture.detectChanges() - // flush() - // expect(fixture.nativeElement.querySelector('.ant-tabs-ink-bar')[0].attribute).not.toContain('hidden') - })) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/create/create.component.spec.ts deleted file mode 100644 index 0280cdd1c..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/create/create.component.spec.ts +++ /dev/null @@ -1,348 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-14 22:56:33 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-21 23:33:15 - * @FilePath: /apinto/src/app/layout/upstream/service-discovery-content/service-discovery-content.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, Type } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { ServiceDiscoveryPublishComponent } from '../publish/publish.component' -import { ServiceDiscoveryMessageComponent } from '../message/message.component' -import { ServiceDiscoveryCreateComponent } from './create.component' -import { of } from 'rxjs' -import { EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' -import { ServiceDiscoveryListComponent } from '../list/list.component' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -describe('ServiceDiscoveryCreateComponent test as editPage is false', () => { - let component: ServiceDiscoveryCreateComponent - let fixture: ComponentFixture - let renderer2: Renderer2 - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, FormsModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - }, - { - path: 'upstream/discovery', - component: ServiceDiscoveryListComponent - } - ] - ) - ], - declarations: [ServiceDiscoveryCreateComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryCreateComponent) - renderer2 = fixture.componentRef.injector.get(Renderer2 as Type) - renderer2.removeAttribute = jest.fn().mockRejectedValue('remove') - - component = fixture.componentInstance - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('change editPage from false to true', () => { - const spyGetServiceMessage = jest.spyOn(component, 'getServiceMessage') - const spyGetDriverList = jest.spyOn(component, 'getDriverList') - expect(spyGetServiceMessage).not.toHaveBeenCalled() - expect(spyGetDriverList).not.toHaveBeenCalled() - component.ngOnInit() - expect(spyGetServiceMessage).not.toHaveBeenCalled() - expect(spyGetDriverList).toHaveBeenCalled() - }) - - it('getDriverList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { drivers: [{ name: 'test1', render: 'render' }, { name: 'test2', render: 'render' }] } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(component.driverList).toStrictEqual([]) - component.getDriverList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.driverList).not.toStrictEqual([]) - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('getDriverList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(component.driverList).toStrictEqual([]) - component.getDriverList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.driverList).toStrictEqual([]) - expect(spyMessage).toHaveBeenCalled() - }) - - it('changeBasedata', fakeAsync(() => { - component.driverList = [{ label: 'test1', value: 'test1', render: 'render1' }, { label: 'test2', value: 'test1', render: 'render2' }] - component.baseData = 'render' - component.createServiceForm.driver = 'test2' - expect(component.baseData).toStrictEqual('render') - component.changeBasedata() - fixture.detectChanges() - expect(component.baseData).toStrictEqual('render2') - })) - - it('getServiceMessage with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { discovery: { name: 'test1', driver: 'static', desc: 'description', config: { addrs: ['test1', 'test2'], params: [{ key: 'key', value: 'value' }] }, render: 'render' } } })) - const isget = httpCommonService.get('') !== null - const spyDriverList = jest.spyOn(component, 'getDriverList') - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(spyDriverList).toHaveBeenCalledTimes(0) - component.getServiceMessage() - fixture.detectChanges() - expect(component.createServiceForm).toStrictEqual({ name: 'test1', driver: 'static', desc: 'description', config: { addrs: ['test1', 'test2'], params: [{ key: 'key', value: 'value' }] }, render: 'render' }) - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyDriverList).toHaveBeenCalledTimes(1) - - const spyService2 = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { discovery: { name: 'test1', driver: 'static', desc: 'description', config: { addrs: ['test1', 'test2'], params: [] }, render: 'render' } } })) - component.getServiceMessage() - fixture.detectChanges() - expect(spyService2).toHaveBeenCalledTimes(5) - expect(component.createServiceForm.config.params).toStrictEqual([{ key: '', value: '' }]) - expect(spyDriverList).toHaveBeenCalledTimes(2) - }) - - it('getServiceMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getServiceMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalled() - }) - - it('saveService with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePost = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const ispost = httpCommonService.post('') !== null - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const isput = httpCommonService.put('') !== null - - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyMessageSuccess).not.toHaveBeenCalled() - const spybackToList = jest.spyOn(component, 'backToList') - expect(spybackToList).not.toHaveBeenCalled() - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - expect(spyMessageError).not.toHaveBeenCalled() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(ispost).toStrictEqual(true) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(isput).toStrictEqual(true) - - component.editPage = false - component.saveService() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spybackToList).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyMessageError).not.toHaveBeenCalled() - - component.editPage = true - component.saveService() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyServicePut).toHaveBeenCalledTimes(2) - expect(spybackToList).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - expect(spyMessageError).not.toHaveBeenCalled() - }) - - it('saveService with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePost = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const ispost = httpCommonService.post('') !== null - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isput = httpCommonService.put('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(ispost).toStrictEqual(true) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(isput).toStrictEqual(true) - - component.editPage = false - component.saveService() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalledTimes(1) - - component.editPage = true - component.saveService() - fixture.detectChanges() - - expect(spyServicePut).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalledTimes(2) - }) - - it('backToList', fakeAsync(() => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - - component.backToList() - fixture.detectChanges() - - expect(spyRouter).toHaveBeenCalled() - })) -}) - -describe('ServiceDiscoveryCreateComponent test as editPage is false', () => { - let component: ServiceDiscoveryCreateComponent - let fixture: ComponentFixture - let renderer2: Renderer2 - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, FormsModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - } - ] - ) - ], - declarations: [ServiceDiscoveryCreateComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryCreateComponent) - renderer2 = fixture.componentRef.injector.get(Renderer2 as Type) - renderer2.removeAttribute = jest.fn().mockRejectedValue('remove') - - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('change editPage from false to true', () => { - const spyGetServiceMessage = jest.spyOn(component, 'getServiceMessage') - const spyGetDriverList = jest.spyOn(component, 'getDriverList') - expect(spyGetServiceMessage).not.toHaveBeenCalled() - expect(spyGetDriverList).not.toHaveBeenCalled() - component.ngOnInit() - expect(spyGetServiceMessage).toHaveBeenCalled() - expect(spyGetDriverList).not.toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/list/list.component.spec.ts deleted file mode 100644 index 9f4dc6f5c..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/list/list.component.spec.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { ServiceDiscoveryMessageComponent } from '../message/message.component' -import { ServiceDiscoveryPublishComponent } from '../publish/publish.component' -import { ServiceDiscoveryListComponent } from './list.component' -import { ServiceDiscoveryCreateComponent } from '../create/create.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('ServiceDiscoveryListComponent test', () => { - let component: ServiceDiscoveryListComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - }, - { - path: 'upstream/discovery/create', - component: ServiceDiscoveryCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryListComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial servicesList', fakeAsync(() => { - expect(component.servicesList).not.toBe([]) - })) - - it('click table btns', () => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - // const spyDeleteCert = jest.spyOn(component, 'deleteCert') - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyRouter).toHaveBeenCalledTimes(0) - expect(spyModal).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.servicesTableBody[4].btns[0].click(item) - expect(spyRouter).toHaveBeenCalledTimes(1) - }) - it('getServicesList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { discoveries: [{ name: 'test1', driver: 'static', desc: 'description', updateTime: 'time', isDelete: 'false' }, { name: 'test2', driver: 'static', desc: 'description', updateTime: 'time', isDelete: 'false' }] } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - component.servicesList = [] - component.serviceName = '' - component.serviceNameForSear = 'test1' - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toBe(true) - - component.getServicesList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.servicesList).not.toBe([]) - expect(component.serviceName).toBe('test1') - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - - component.getServicesList(true) - fixture.detectChanges() - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - }) - - it('getServicesList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyMessageSuccess).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toBe(true) - - component.getServicesList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).not.toHaveBeenCalled() - }) - - it('addService', fakeAsync(() => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - - component.addService() - fixture.detectChanges() - - expect(spyRouter).toHaveBeenCalled() - })) - - it('delete modal is created', () => { - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyModal).not.toHaveBeenCalled() - component.delete('test') - expect(spyModal).toHaveBeenCalled() - }) - - it('deleteDiscovery with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const isdelete = httpCommonService.delete('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetServicesList = jest.spyOn(component, 'getServicesList') - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isdelete).toBe(true) - expect(spyGetServicesList).not.toHaveBeenCalled() - - component.deleteDiscovery('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetServicesList).toHaveBeenCalled() - }) - - it('deleteDiscovery with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(0) - expect(isget).toBe(true) - - component.deleteDiscovery('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/message/message.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/message/message.component.spec.ts deleted file mode 100644 index 0a50cec5c..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/message/message.component.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { ServiceDiscoveryPublishComponent } from '../publish/publish.component' -import { ServiceDiscoveryCreateComponent } from '../create/create.component' -import { ServiceDiscoveryMessageComponent } from './message.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('ServiceDiscoveryMessageComponent test', () => { - let component: ServiceDiscoveryMessageComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - }, - { - path: 'upstream/discovery/create', - component: ServiceDiscoveryCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryMessageComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/publish/publish.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/publish/publish.component.spec.ts deleted file mode 100644 index 8cbc954fe..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/publish/publish.component.spec.ts +++ /dev/null @@ -1,419 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { ServiceDiscoveryPublishComponent } from './publish.component' -import { ServiceDiscoveryCreateComponent } from '../create/create.component' -import { ServiceDiscoveryMessageComponent } from '../message/message.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } - - remove () { - return 'remove' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('ServiceDiscoveryMessageComponent test', () => { - let component: ServiceDiscoveryPublishComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - }, - { - path: 'upstream/discovery/create', - component: ServiceDiscoveryCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(ServiceDiscoveryPublishComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('click table btns', () => { - const spyUpdateOrOnline = jest.spyOn(component, 'updateOrOnline') - const spyOffline = jest.spyOn(component, 'offline') - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(0) - expect(spyOffline).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.clustersTableBody[5].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(0) - - component.clustersTableBody[5].btns[1].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(1) - - component.clustersTableBody[6].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(2) - - component.clustersTableBody[7].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(2) - expect(spyOffline).toHaveBeenCalledTimes(2) - }) - - it('getClustersData with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - const isget = httpCommonService.get('') !== null - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getClustersData() - fixture.detectChanges() - expect(component.clustersList).toStrictEqual([1, 2, 3]) - expect(spyService).toHaveBeenCalledTimes(2) - }) - - it('getClustersData with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getClustersData() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalled() - }) - - it('updateOrOnline with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - - component.updateOrOnline({ name: 'test' }, '更新') - fixture.detectChanges() - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyGetClustersData).toHaveBeenCalledTimes(1) - }) - - it('updateOrOnline with fail return(no router)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: {}, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('updateOrOnline with fail return(no router)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: { router: { name: 'routerName', params: 'routerParams' } }, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('routerName') - expect(component.solutionParam).toStrictEqual('routerParams') - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('routerName') - expect(component.solutionParam).toStrictEqual('routerParams') - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('offline with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - - component.offline({ name: 'test' }) - fixture.detectChanges() - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyGetClustersData).toHaveBeenCalledTimes(1) - }) - - it('offline with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: {}, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.offline({ name: 'test' }) - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('下线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.offline({ name: 'test' }) - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('closeErrorBtn', fakeAsync(() => { - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - component.errorMessageId = '' - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - expect(component.errorMessageId).toStrictEqual('') - - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(2) - expect(component.errorMessageId).toStrictEqual('') - - component.errorMessageId = '100' - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(3) - expect(component.errorMessageId).toStrictEqual('') - })) - - it('viewSolution', fakeAsync(() => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - - expect(spyRouter).toHaveBeenCalledTimes(0) - - component.solutionRouter = 'test' - component.viewSolution() - fixture.detectChanges() - expect(spyRouter).toHaveBeenCalledTimes(1) - - component.solutionRouter = 'test/test' - component.viewSolution() - fixture.detectChanges() - expect(spyRouter).toHaveBeenCalledTimes(2) - })) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/service-discovery/service-discovery.component.test.ts b/frontend/projects/core/src/app/layout/upstream/service-discovery/service-discovery.component.test.ts deleted file mode 100644 index 01a6f9fbb..000000000 --- a/frontend/projects/core/src/app/layout/upstream/service-discovery/service-discovery.component.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -describe('服务发现 e2e test', () => { - it('初始化页面,点击上游服务-服务发现菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByText('上游服务').click() - await page.getByRole('link', { name: '服务发现' }).click() - }) - it('检查页面样式', async () => { - // 新建应用的按钮样式 - const createBtn = await page.getByRole('button', { name: '新建服务' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 搜索框的样式 - const searchInput = await page.locator('eo-ng-input-group') - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInputW = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInputBC = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchInputML = await (await page.locator('.mg-top-right >> nth = 1')).evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - - expect(searchInputH).toStrictEqual('32px') - expect(searchInputW).toStrictEqual('254px') - expect(searchInputBC).toStrictEqual('rgb(215, 215, 215)') - expect(searchInputML).toStrictEqual('24px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - }) - it('点击新建服务,检查样式,点击取消并返回列表', async () => { - await page.getByRole('button', { name: '新建服务' }).click() - - // 注册中心输入框样式 - const nameInput = await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 描述样式 - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 服务类型样式 - const schemeInput = await page.locator('eo-ng-select#driver') - const schemeInputW = await schemeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const schemeInputH = await schemeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(schemeInputW).toStrictEqual('346px') - await expect(schemeInputH).toStrictEqual('32px') - - // 动态渲染 - const dynamicArea = await page.locator('dynamic-component#dynamic') - const dynamicAreaP = await dynamicArea.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const dynamicAreaBGC = await dynamicArea.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const dynamicAreaH = await dynamicArea.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const dynamicAreaW = await dynamicArea.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(dynamicAreaP).toStrictEqual('20px') - await expect(dynamicAreaBGC).toStrictEqual('rgb(251, 251, 251)') - await expect(dynamicAreaH).toStrictEqual('auto') - await expect(dynamicAreaW).toStrictEqual('auto') - - const space1 = await page.locator('nz-space >> nth = 0') - let space1H = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - let space1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space1H).toStrictEqual('48px') - await expect(space1W).toStrictEqual('378px') - - const space1Input1 = await page.locator('nz-space >> nth = 0 >> input') - const space1Input1H = await space1Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space1Input1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space1Input1H).toStrictEqual('32px') - await expect(space1Input1W).toStrictEqual('346px') - - const space1Btn = await page.locator('nz-space >> nth = 0 >> a') - const space1BtnH = await space1Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space1BtnW = await space1Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space1BtnLH = await space1Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space1BtnC = await space1Btn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space1BtnH).toStrictEqual('32px') - await expect(space1BtnW).toStrictEqual('20px') - await expect(space1BtnLH).toStrictEqual('32px') - await expect(space1BtnC).toStrictEqual('rgb(34, 84, 157)') - - const space2 = await page.locator('nz-space >> nth = 1') - let space2H = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - let space2W = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space2H).toStrictEqual('48px') - await expect(space2W).toStrictEqual('474px') - - const space2Input1 = await page.locator('nz-space >> nth = 1 >> input >> nth = 0') - const space2Input1H = await space2Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2Input1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space2Input1H).toStrictEqual('32px') - await expect(space2Input1W).toStrictEqual('174px') - - const space2Input2 = await page.locator('nz-space >> nth = 1 >> input >> nth = 1') - const space2Input2H = await space2Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2Input2W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space2Input2M = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space2Input2H).toStrictEqual('32px') - await expect(space2Input2W).toStrictEqual('164px') - await expect(space2Input2M).toStrictEqual('0px 0px 0px 8px') - - const space2A = await page.locator('nz-space >> nth = 1 >> a >> nth = 0') - const space2AH = await space2A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2ALH = await space2A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const space2AC = await space2A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const space2AM = await space2A.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space2AH).toStrictEqual('32px') - await expect(space2ALH).toStrictEqual('32PX') - await expect(space2AC).toStrictEqual('rgb(34, 84, 157)') - await expect(space2AM).toStrictEqual('0px 0px 0px 12px') - - const space2A2 = await page.locator('nz-space >> nth = 1 >> a >> nth = 1') - const space2A2H = await space2A2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2A2LH = await space2A2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const space2A2C = await space2A2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const space2A2M = await space2A2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space2A2H).toStrictEqual('32px') - await expect(space2A2LH).toStrictEqual('32PX') - await expect(space2A2C).toStrictEqual('rgb(34, 84, 157)') - await expect(space2A2M).toStrictEqual('0px 0px 0px 12px') - - await page.locator('section').filter({ hasText: '*Nacos地址引用环境变量' }).locator('a').click() - await page.locator('#dynamic a').nth(4).click() - - space1H = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - space1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space1H).toStrictEqual('48px') - await expect(space1W).toStrictEqual('410px') - - space2H = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - space2W = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space2H).toStrictEqual('48px') - await expect(space2W).toStrictEqual('474px') - - const space3 = await page.locator('nz-space >> nth = 1') - const space3H = await space3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space3W = await space3.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space3H).toStrictEqual('48px') - await expect(space3W).toStrictEqual('506px') - - const space4 = await page.locator('nz-space >> nth = 3') - const space4H = await space4.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space4W = await space4.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space4H).toStrictEqual('48px') - await expect(space4W).toStrictEqual('506px') - - await page.getByPlaceholder('请输入主机名或IP:端口').first().click() - await page.getByPlaceholder('请输入主机名或IP:端口').first().fill('test') - await page.getByPlaceholder('请输入主机名或IP:端口').first().fill('') - await page.getByRole('button', { name: '保存' }).click() - - space1H = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - space1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - await expect(space1H).toStrictEqual('70px') - await expect(space1W).toStrictEqual('410px') - - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击新建服务,逐一填入必输项并提交,返回列表页', async () => {}) - it('点击表格中的某一项,进入上线管理页,点击tab切换至服务信息页,检查样式;修改内容并提交', async () => {}) - it('点击表格中的某一项,进入上线管理页,检查上线管理页样式与操作,点击面包屑返回列表', async () => {}) - it('点击表格中的某一项,进入上线管理页,点击tab切换至服务信息页,点击取消', async () => {}) - it('点击表格中的某一项,进入上线管理页,点击tab切换至服务信息页,点击面包屑返回列表', async () => {}) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/content/content.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/upstream/content/content.component.spec.ts deleted file mode 100644 index 13e16b837..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/content/content.component.spec.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-14 22:56:33 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-14 23:02:19 - * @FilePath: /apinto/src/app/layout/upstream/service-discovery-content/service-discovery-content.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, Type } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { UpstreamContentComponent } from './content.component' -import { UpstreamListComponent } from '../list/list.component' -import { UpstreamMessageComponent } from '../message/message.component' -import { UpstreamPublishComponent } from '../publish/publish.component' -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -describe('UpstreamContentComponent test', () => { - let component: UpstreamContentComponent - let fixture: ComponentFixture - let renderer2: Renderer2 - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: UpstreamListComponent - }, - { - path: 'message', - component: UpstreamMessageComponent - }, - { - path: 'publish', - component: UpstreamPublishComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamContentComponent) - renderer2 = fixture.componentRef.injector.get(Renderer2 as Type) - renderer2.removeAttribute = jest.fn().mockReturnValue('remove') - - component = fixture.componentInstance - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('should initial clusterDesc and tabOptions after ngAfterViewInit', fakeAsync(() => { - component.tabOptions = [] - component.ngAfterViewInit() - fixture.detectChanges() - expect(component.tabOptions).not.toStrictEqual([]) - })) - - it('should remove hidden attribute from tabs ngAfterViewChecked', fakeAsync(() => { - // @ts-ignore - const spyRemoveAttr = jest.spyOn(component.renderer, 'removeAttribute') - expect(spyRemoveAttr).toHaveBeenCalledTimes(1) - component.ngAfterViewChecked() - fixture.detectChanges() - expect(spyRemoveAttr).toHaveBeenCalledTimes(3) - })) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/create/create.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/upstream/create/create.component.spec.ts deleted file mode 100644 index ecce5fb74..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/create/create.component.spec.ts +++ /dev/null @@ -1,552 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-14 22:56:33 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-09-03 20:10:16 - * @FilePath: /apinto/src/app/layout/upstream/service-discovery-content/service-discovery-content.component.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { RouterModule } from '@angular/router' -import { ElementRef, Renderer2, ChangeDetectorRef, Type } from '@angular/core' -import { APP_BASE_HREF } from '@angular/common' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { environment } from 'projects/core/src/environments/environment' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { of } from 'rxjs' -import { EoNgFeedbackMessageService, EoNgFeedbackModalService } from 'eo-ng-feedback' -import { FormsModule } from '@angular/forms' -import { UpstreamMessageComponent } from '../message/message.component' -import { ServiceDiscoveryMessageComponent } from '../../service-discovery/message/message.component' -import { ServiceDiscoveryPublishComponent } from '../../service-discovery/publish/publish.component' -import { UpstreamCreateComponent } from './create.component' - -import { EoNgSelectModule } from 'eo-ng-select' -import { LayoutModule } from 'projects/core/src/app/layout/layout.module' -import { EoNgTableModule } from 'eo-ng-table' - -class MockRenderer { - removeAttribute (element: any, cssClass: string) { - return cssClass + 'is removed from' + element - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -jest.mock('uuid', () => { - return { - v4: () => 123456789 - } -}) - -describe('UpstreamCreateComponent test as editPage is false', () => { - let component: UpstreamCreateComponent - let fixture: ComponentFixture - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, FormsModule, EoNgSelectModule, LayoutModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - EoNgTableModule, - RouterModule.forRoot([ - { - path: '', - component: UpstreamCreateComponent - }, - { - path: 'message', - component: UpstreamMessageComponent - } - ] - ) - ], - declarations: [UpstreamCreateComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamCreateComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('change editPage from false to true', () => { - const spyGetUpstreamMessage = jest.spyOn(component, 'getUpstreamMessage') - const spyGetDiscovery = jest.spyOn(component, 'getDiscovery') - expect(spyGetUpstreamMessage).not.toHaveBeenCalled() - expect(spyGetDiscovery).not.toHaveBeenCalled() - component.ngOnInit() - expect(spyGetUpstreamMessage).not.toHaveBeenCalled() - expect(spyGetDiscovery).toHaveBeenCalled() - }) - - it('getDiscovery with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { discoveries: [{ name: 'test1', render: 'render1', driver: 'static' }, { name: 'test2', render: 'render2', driver: 'driver2' }] } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(component.discoveryList).toStrictEqual([]) - component.createUpstreamForm.discoveryName = 'test1' - component.getDiscovery() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.discoveryList).toStrictEqual( - [{ label: '静态节点', value: 'test1', render: 'render1' }, - { label: 'test2[driver2]', value: 'test2', render: 'render2' } - ] - ) - expect(component.baseData).toStrictEqual('render1') - expect(spyMessage).not.toHaveBeenCalled() - - component.discoveryList = [] - component.createUpstreamForm.discoveryName = 'test2' - component.getDiscovery() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(3) - expect(component.discoveryList).toStrictEqual( - [{ label: '静态节点', value: 'test1', render: 'render1' }, - { label: 'test2[driver2]', value: 'test2', render: 'render2' } - ] - ) - expect(component.baseData).toStrictEqual('render2') - expect(spyMessage).not.toHaveBeenCalled() - }) - - it('getDiscovery with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(component.discoveryList).toStrictEqual([]) - component.getDiscovery() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.discoveryList).toStrictEqual([]) - expect(spyMessage).toHaveBeenCalled() - }) - - it('changeBasedata', fakeAsync(() => { - component.discoveryList = [{ label: '静态节点', value: 'test1', render: 'render1' }, - { label: 'test2[driver2]', value: 'test2', render: 'render2' } - ] - component.baseData = 'render' - component.createUpstreamForm.discoveryName = 'test' - expect(component.baseData).toStrictEqual('render') - component.changeBasedata() - fixture.detectChanges() - expect(component.baseData).toStrictEqual('render') - - component.baseData = 'render' - component.createUpstreamForm.discoveryName = 'test1' - expect(component.baseData).toStrictEqual('render') - component.changeBasedata() - fixture.detectChanges() - expect(component.baseData).toStrictEqual('render1') - })) - - it('getUpstreamMessage with success return', () => { - const mockValue:any = { - code: 0, - data: { - service: { - name: 'test1', - driver: 'static', - desc: 'description', - config: { - addrs: ['test1', 'test2'], - params: [{ - key: 'key', - value: 'value' - }] - }, - render: 'render' - } - } - } - const mockRes:any = { - name: 'test1', - driver: 'static', - desc: 'description', - config: { - serviceName: '', - useVariable: false, - addrsVariable: '', - staticConf: [{ - addr: '', - weight: null - }], - addrs: ['test1', 'test2'], - params: [{ - key: 'key', - value: 'value' - }] - }, - render: 'render' - } - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of(mockValue)) - const isget = httpCommonService.get('') !== null - const spyGetDiscovery = jest.spyOn(component, 'getDiscovery') - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - expect(spyGetDiscovery).toHaveBeenCalledTimes(0) - component.getUpstreamMessage() - fixture.detectChanges() - expect(component.createUpstreamForm).toStrictEqual(mockRes) - expect(spyService).toHaveBeenCalledTimes(3) - expect(spyGetDiscovery).toHaveBeenCalledTimes(1) - - const mockValue2 = { - code: 0, - data: { - service: { - name: 'test1', - driver: 'static', - desc: 'description', - config: { - staticConf: [{ addr: 'addr1', weight: 'weight1' }] - } - } - } - } - - const mockRes2 = { - name: 'test1', - driver: 'static', - desc: 'description', - config: { - serviceName: '', - useVariable: false, - addrsVariable: '', - staticConf: [{ addr: 'addr1', weight: 'weight1' }] - } - } - const spyService2 = jest.spyOn(httpCommonService, 'get').mockReturnValue(of(mockValue2)) - component.getUpstreamMessage() - fixture.detectChanges() - expect(spyService2).toHaveBeenCalledTimes(5) - expect(component.createUpstreamForm).toStrictEqual(mockRes2) - expect(spyGetDiscovery).toHaveBeenCalledTimes(2) - }) - - it('getUpstreamMessage with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getUpstreamMessage() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalled() - }) - - it('getDataFromDynamicComponent when discoveryName is static', () => { - const testVal1 = { - discoveryName: 'static', - config: { - serviceName: '', - useVariable: true, - addrsVariable: '', - staticConf: [{ weight: 0, addr: '' }] - } - } - - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(false) - - testVal1.config.addrsVariable = 'test' - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(true) - - testVal1.config.useVariable = false - expect(component.canBeSave).toStrictEqual(true) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(false) - - testVal1.config.staticConf = [{ addr: 'testAddr', weight: 0 }] - - testVal1.config.useVariable = false - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(false) - - testVal1.config.staticConf = [{ addr: '', weight: 3 }] - - testVal1.config.useVariable = false - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(false) - - testVal1.config.staticConf = [{ addr: 'testAddr', weight: 3 }] - - testVal1.config.useVariable = false - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal1) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(true) - }) - - it('getDataFromDynamicComponent when discoveryName is static', () => { - const testVal2 = { - discoveryName: 'test', - config: { - serviceName: '', - useVariable: true, - addrsVariable: '', - staticConf: [{ weight: 0, addr: '' }] - } - } - - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal2) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(false) - - testVal2.config.serviceName = 'test' - - expect(component.canBeSave).toStrictEqual(false) - component.getDataFromDynamicComponent(testVal2) - fixture.detectChanges() - - expect(component.canBeSave).toStrictEqual(true) - }) - - it('saveUpstream with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePost = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const ispost = httpCommonService.post('') !== null - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const isput = httpCommonService.put('') !== null - - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - expect(spyMessageSuccess).not.toHaveBeenCalled() - const spybackToList = jest.spyOn(component, 'backToList') - expect(spybackToList).not.toHaveBeenCalled() - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - expect(spyMessageError).not.toHaveBeenCalled() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(ispost).toStrictEqual(true) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(isput).toStrictEqual(true) - - component.createUpstreamForm = { - name: '', - desc: '', - scheme: 'HTTP', - balance: 'round-robin', - discoveryName: 'static', - timeout: 100, - config: { - addrsVariable: '', - useVariable: false, - serviceName: '', - staticConf: [] - } - } - - component.editPage = false - component.saveUpstream() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(spybackToList).toHaveBeenCalled() - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyMessageError).not.toHaveBeenCalled() - - component.editPage = true - component.saveUpstream() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyServicePut).toHaveBeenCalledTimes(2) - expect(spybackToList).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(2) - expect(spyMessageError).not.toHaveBeenCalled() - }) - - it('saveUpstream with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyServicePost = jest.spyOn(httpCommonService, 'post').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const ispost = httpCommonService.post('') !== null - const spyServicePut = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isput = httpCommonService.put('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyServicePost).toHaveBeenCalledTimes(1) - expect(ispost).toStrictEqual(true) - expect(spyServicePut).toHaveBeenCalledTimes(1) - expect(isput).toStrictEqual(true) - - component.editPage = false - component.saveUpstream() - fixture.detectChanges() - - expect(spyServicePost).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalledTimes(1) - - component.editPage = true - component.saveUpstream() - fixture.detectChanges() - - expect(spyServicePut).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalledTimes(2) - }) - - it('backToList', fakeAsync(() => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - - component.backToList() - fixture.detectChanges() - - expect(spyRouter).toHaveBeenCalled() - })) -}) - -describe('UpstreamCreateComponent test as editPage is false', () => { - let component: UpstreamCreateComponent - let fixture: ComponentFixture - let renderer2: Renderer2 - class MockElementRef extends ElementRef { - constructor () { super(null) } - } - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, FormsModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: ServiceDiscoveryPublishComponent - }, - { - path: 'message', - component: ServiceDiscoveryMessageComponent - } - ] - ) - ], - declarations: [UpstreamCreateComponent - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: Renderer2, useClass: MockRenderer }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService }, - { provide: ChangeDetectorRef, useClass: ChangeDetectorRef } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamCreateComponent) - renderer2 = fixture.componentRef.injector.get(Renderer2 as Type) - renderer2.removeAttribute = jest.fn().mockRejectedValue('remove') - - component = fixture.componentInstance - component.editPage = true - fixture.detectChanges() - }) - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('change editPage from false to true', () => { - const spyGetUpstreamMessage = jest.spyOn(component, 'getUpstreamMessage') - const spyGetDiscovery = jest.spyOn(component, 'getDiscovery') - expect(spyGetUpstreamMessage).not.toHaveBeenCalled() - expect(spyGetDiscovery).not.toHaveBeenCalled() - component.ngOnInit() - expect(spyGetUpstreamMessage).toHaveBeenCalled() - expect(spyGetDiscovery).not.toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/list/list.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/upstream/list/list.component.spec.ts deleted file mode 100644 index 174ab9b27..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/list/list.component.spec.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { UpstreamCreateComponent } from '../create/create.component' -import { UpstreamMessageComponent } from '../message/message.component' -import { UpstreamListComponent } from './list.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('UpstreamListComponent test', () => { - let component: UpstreamListComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: UpstreamCreateComponent - }, - { - path: 'message', - component: UpstreamMessageComponent - }, - { - path: 'upstream/upstream/create', - component: UpstreamCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamListComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('ngOnInit should call method getUpstreamsList', () => { - const spyGetUpstreamList = jest.spyOn(component, 'getUpstreamsList') - expect(spyGetUpstreamList).not.toHaveBeenCalled() - component.ngOnInit() - fixture.detectChanges() - expect(spyGetUpstreamList).toHaveBeenCalledTimes(1) - }) - - it('click table btns', () => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.upstreamsTableBody[5].btns[0].click(item) - expect(spyRouter).toHaveBeenCalledTimes(1) - }) - - it('getUpstreamsList with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { services: { test: 'test' }, total: 10 } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - component.upstreamsList = [] - component.total = 0 - component.upstreamName = '' - component.upstreamNameForSear = 'test1' - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toBe(true) - - component.getUpstreamsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(component.upstreamsList).not.toBe([]) - expect(component.total).toBe(10) - expect(component.upstreamName).toBe('test1') - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - - component.getUpstreamsList(true) - fixture.detectChanges() - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - }) - - it('getUpstreamsList with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessageSuccess).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toBe(true) - expect(spyMessage).not.toHaveBeenCalled() - - component.getUpstreamsList() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - }) - - it('addUpstream', fakeAsync(() => { - // @ts-ignore - const spyRouter = jest.spyOn(component.router, 'navigate') - expect(spyRouter).not.toHaveBeenCalled() - - component.addUpstream() - fixture.detectChanges() - - expect(spyRouter).toHaveBeenCalled() - })) - - it('delete modal is created', () => { - // @ts-ignore - const spyModal = jest.spyOn(component.modalService, 'create') - expect(spyModal).not.toHaveBeenCalled() - component.delete('test') - expect(spyModal).toHaveBeenCalled() - }) - - it('deleteService with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 0, data: { msg: 'success' } })) - const isdelete = httpCommonService.delete('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetUpstreamsList = jest.spyOn(component, 'getUpstreamsList') - expect(spyMessage).not.toHaveBeenCalled() - expect(spyMessageSuccess).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isdelete).toBe(true) - expect(spyGetUpstreamsList).not.toHaveBeenCalled() - - component.deleteService('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalled() - expect(spyGetUpstreamsList).toHaveBeenCalled() - }) - - it('deleteService with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'delete').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(0) - expect(isget).toBe(true) - - component.deleteService('test') - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(spyMessage).toHaveBeenCalled() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/message/message.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/upstream/message/message.component.spec.ts deleted file mode 100644 index 5897fa4f1..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/message/message.component.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { RouterModule } from '@angular/router' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { UpstreamCreateComponent } from '../create/create.component' -import { UpstreamMessageComponent } from './message.component' - -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('UpstreamMessageComponent test', () => { - let component: UpstreamMessageComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: UpstreamMessageComponent - }, - { - path: 'message', - component: UpstreamMessageComponent - }, - { - path: 'upstream/upstream/create', - component: UpstreamCreateComponent - } - ] - ) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamMessageComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/publish/publish.component.spec.ts b/frontend/projects/core/src/app/layout/upstream/upstream/publish/publish.component.spec.ts deleted file mode 100644 index edbb3255a..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/publish/publish.component.spec.ts +++ /dev/null @@ -1,401 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing' -import { NzOutletModule } from 'ng-zorro-antd/core/outlet' -import { NzDrawerModule } from 'ng-zorro-antd/drawer' -import { HttpClientModule } from '@angular/common/http' -import { ApiService, API_URL } from 'projects/core/src/app/service/api.service' -import { environment } from 'projects/core/src/environments/environment' -import { APP_BASE_HREF } from '@angular/common' -import { NzOverlayModule } from 'ng-zorro-antd/core/overlay' -import { NoopAnimationsModule } from '@angular/platform-browser/animations' -import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation' -import { BidiModule } from '@angular/cdk/bidi' -import { Overlay } from '@angular/cdk/overlay' -import { EoNgFeedbackDrawerService, EoNgFeedbackModalService, EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { Subject } from 'rxjs/internal/Subject' -import { of } from 'rxjs' -import { ElementRef } from '@angular/core' -import { UpstreamPublishComponent } from './publish.component' -import { RouterModule } from '@angular/router' -import { UpstreamListComponent } from '../list/list.component' -import { UpstreamMessageComponent } from '../message/message.component' -import { UpstreamCreateComponent } from '../create/create.component' -class MockDrawerService { - result:boolean =false - - nzAfterClose = new Subject(); - - create () { - return { - afterClose: { - subscribe: () => { of(this.result) } - }, - close: () => { - return 'drawer is close' - } - } - } -} - -class MockMessageService { - success () { - return 'success' - } - - error () { - return 'error' - } - - remove () { - return 'remove' - } -} - -class MockElementRef extends ElementRef { - constructor () { super(null) } -} - -class MockEnsureService { - create () { - return 'modal is create' - } -} - -describe('UpstreamPublishComponent test', () => { - let component: UpstreamPublishComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NzOverlayModule, - BidiModule, NoopAnimationsModule, NzNoAnimationModule, - NzDrawerModule, NzOutletModule, HttpClientModule, - RouterModule.forRoot([ - { - path: '', - component: UpstreamListComponent - }, - { - path: 'message', - component: UpstreamMessageComponent - }, - { - path: 'upstream/upstream/create', - component: UpstreamCreateComponent - } - ]) - ], - declarations: [ - ], - providers: [ - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: ElementRef, useValue: new MockElementRef() }, - { provide: EoNgFeedbackDrawerService, useClass: MockDrawerService }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService }, - { provide: EoNgFeedbackModalService, useClass: MockEnsureService } - ] - }).compileComponents() - - fixture = TestBed.createComponent(UpstreamPublishComponent) - - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) - - it('click table btns', () => { - const spyUpdateOrOnline = jest.spyOn(component, 'updateOrOnline') - const spyOffline = jest.spyOn(component, 'offline') - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(0) - expect(spyOffline).toHaveBeenCalledTimes(0) - - const item = { key: 'test' } - component.clustersTableBody[5].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(0) - - component.clustersTableBody[5].btns[1].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(1) - - component.clustersTableBody[6].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(1) - expect(spyOffline).toHaveBeenCalledTimes(2) - - component.clustersTableBody[7].btns[0].click(item) - expect(spyUpdateOrOnline).toHaveBeenCalledTimes(2) - expect(spyOffline).toHaveBeenCalledTimes(2) - }) - - it('getClustersData with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - const isget = httpCommonService.get('') !== null - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getClustersData() - fixture.detectChanges() - expect(component.clustersList).toStrictEqual([1, 2, 3]) - expect(spyService).toHaveBeenCalledTimes(2) - }) - - it('getClustersData with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'get').mockReturnValue(of({ code: 1, data: { msg: 'fail' } })) - const isget = httpCommonService.get('') !== null - // @ts-ignore - const spyMessage = jest.spyOn(component.message, 'error') - expect(spyMessage).not.toHaveBeenCalled() - - expect(spyService).toHaveBeenCalledTimes(1) - expect(isget).toStrictEqual(true) - - component.getClustersData() - fixture.detectChanges() - - expect(spyService).toHaveBeenCalledTimes(2) - expect(spyMessage).toHaveBeenCalled() - }) - - it('updateOrOnline with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - - component.updateOrOnline({ name: 'test' }, '更新') - fixture.detectChanges() - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyGetClustersData).toHaveBeenCalledTimes(1) - }) - - it('updateOrOnline with fail return(no router)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: {}, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('updateOrOnline with fail return(no router)', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: { router: { name: 'routerName', params: 'routerParams' } }, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('routerName') - expect(component.solutionParam).toStrictEqual('routerParams') - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.updateOrOnline({ name: 'test' }, '上线') - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('routerName') - expect(component.solutionParam).toStrictEqual('routerParams') - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('offline with success return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: 0, data: { clusters: [1, 2, 3] } })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - - component.offline({ name: 'test' }) - fixture.detectChanges() - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(1) - expect(spyGetClustersData).toHaveBeenCalledTimes(1) - }) - - it('offline with fail return', () => { - const httpCommonService = fixture.debugElement.injector.get(ApiService) - const spyService = jest.spyOn(httpCommonService, 'put').mockReturnValue(of({ code: -1, data: {}, msg: 'fail' })) - - // @ts-ignore - const spyMessageError = jest.spyOn(component.message, 'error') - // @ts-ignore - const spyMessageSuccess = jest.spyOn(component.message, 'success') - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - const spyGetClustersData = jest.spyOn(component, 'getClustersData') - - expect(spyService).toHaveBeenCalledTimes(0) - expect(spyMessageError).toHaveBeenCalledTimes(0) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - component.errorMessageId = '' - component.offline({ name: 'test' }) - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(1) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('下线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - - component.offline({ name: 'test' }) - fixture.detectChanges() - - fixture.whenStable().then(() => { - expect(spyMessageError).toHaveBeenCalledTimes(2) - expect(spyMessageSuccess).toHaveBeenCalledTimes(0) - expect(spyGetClustersData).toHaveBeenCalledTimes(0) - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - - expect(component.solutionRouter).toStrictEqual('') - expect(component.solutionParam).toStrictEqual({}) - expect(component.type).toStrictEqual('上线') - expect(component.failmsg).toStrictEqual('fail') - expect(component.errorMessageId).not.toStrictEqual('') - }) - }) - - it('closeErrorBtn', fakeAsync(() => { - // @ts-ignore - const spyMessageRemove = jest.spyOn(component.message, 'remove') - - expect(spyMessageRemove).toHaveBeenCalledTimes(0) - component.errorMessageId = '' - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(1) - expect(component.errorMessageId).toStrictEqual('') - - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(2) - expect(component.errorMessageId).toStrictEqual('') - - component.errorMessageId = '100' - component.closeErrorBtn() - fixture.detectChanges() - expect(spyMessageRemove).toHaveBeenCalledTimes(3) - expect(component.errorMessageId).toStrictEqual('') - })) -}) diff --git a/frontend/projects/core/src/app/layout/upstream/upstream/upstream.component.test.ts b/frontend/projects/core/src/app/layout/upstream/upstream/upstream.component.test.ts deleted file mode 100644 index 5f8bd9003..000000000 --- a/frontend/projects/core/src/app/layout/upstream/upstream/upstream.component.test.ts +++ /dev/null @@ -1,667 +0,0 @@ -describe('上游管理 e2e test', () => { - it('初始化页面,点击基础设施-环境变量菜单,进入列表页', async () => { - await page.goto('http://localhost:4200/login') - await page.waitForTimeout(2000) - await page.getByPlaceholder('请输入账号').click() - await page.getByPlaceholder('请输入账号').fill('maggie') - await page.getByPlaceholder('请输入账号').press('Tab') - await page.getByPlaceholder('请输入密码').fill('12345678') - await page.getByPlaceholder('请输入密码').press('Enter') - await page.getByText('基础设施').click() - await page.getByRole('link', { name: '网关集群' }).click() - }) - it('检查页面样式', async () => { - // 新建应用的按钮样式 - const createBtn = await page.getByRole('button', { name: '新建上游' }) - const createBtnH = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const createBtnW = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const createBtnBG = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const createBtnBC = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const createBtnFS = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const createBtnML = await createBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-left')) - - expect(createBtnH).toStrictEqual('32px') - expect(createBtnW).toStrictEqual('82px') - expect(createBtnBG).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnBC).toStrictEqual('rgb(34, 84, 157)') - expect(createBtnFS).toStrictEqual('14px') - expect(createBtnML).toStrictEqual('12px') - - // 搜索框的样式 - const searchInput = await page.locator('eo-ng-input-group') - const searchInputH = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const searchInputW = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const searchInputBC = await searchInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const searchInputML = await (await page.locator('.mg-top-right >> nth = 1')).evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - - expect(searchInputH).toStrictEqual('32px') - expect(searchInputW).toStrictEqual('254px') - expect(searchInputBC).toStrictEqual('rgb(215, 215, 215)') - expect(searchInputML).toStrictEqual('24px') - - // 表格的样式 - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - - // 分页样式 - const paginationM = await page.locator('.mg_pagination_t') - const paginationMT = await paginationM.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - const paginationMH = await paginationM.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(paginationMT).toStrictEqual('16px') - expect(paginationMH).toStrictEqual('32px') - - const pagination = await page.locator('eo-ng-pagination') - const paginationMR = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-right')) - const paginationH = await pagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - expect(paginationMR).toStrictEqual('24px') - expect(paginationH).toStrictEqual('32px') - }) - it('点击新建上游,检查页面样式,测试添加环境变量弹窗后,点击取消返回列表', async () => { - await page.getByRole('button', { name: '新建上游' }).click() - - // 上游名称输入框样式 - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - - // 描述样式 - const descInput = await page.locator('textarea#desc') - const descInputW = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const descInputH = await descInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(descInputW).toStrictEqual('346px') - await expect(descInputH).toStrictEqual('68px') - - // 请求协议样式 - const schemeInput = await page.locator('eo-ng-select#scheme') - const schemeInputW = await schemeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const schemeInputH = await schemeInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(schemeInputW).toStrictEqual('346px') - await expect(schemeInputH).toStrictEqual('32px') - - // 负载算法输入框样式 - const balanceInput = await page.locator('eo-ng-select#balance') - const balanceInputW = await balanceInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const balanceInputH = await balanceInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(balanceInputW).toStrictEqual('346px') - await expect(balanceInputH).toStrictEqual('32px') - - // 服务发现输入框样式 - const discoveryInput = await page.locator('eo-ng-select#discoveryName') - const discoveryInputW = await discoveryInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const discoveryInputH = await discoveryInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(discoveryInputW).toStrictEqual('346px') - await expect(discoveryInputH).toStrictEqual('32px') - - // 请求超时时间输入框样式 - const timeoutInput = await page.locator('input#timeout') - const timeoutInputW = await timeoutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const timeoutInputH = await timeoutInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - - await expect(timeoutInputW).toStrictEqual('346px') - await expect(timeoutInputH).toStrictEqual('32px') - - // 动态渲染部分 - const checkboxLabel = await page.locator('.ant-checkbox-wrapper span >> nth = 1').getByText('引用环境变量') - const checkboxLabelC = await checkboxLabel.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const checkboxLabelPL = await checkboxLabel.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - await expect(checkboxLabelC).toStrictEqual('rgb(102, 102, 102)') - await expect(checkboxLabelPL).toStrictEqual('12px') - - const space1 = await page.locator('.ArrayItems nz-space').first() - let space1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - let space1H = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1W).toStrictEqual('517px') - await expect(space1H).toStrictEqual('52px') - - const space1Input1 = await page.locator('.ArrayItems nz-space').first().locator('input').first() - let space1Input1W = await space1Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - let space1Input1H = await space1Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1Input1W).toStrictEqual('346px') - await expect(space1Input1H).toStrictEqual('32px') - - const space1Input2 = await page.locator('.ArrayItems nz-space').first().locator('input >> nth = 1') - let space1Input2W = await space1Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - let space1Input2H = await space1Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1Input2W).toStrictEqual('131px') - await expect(space1Input2H).toStrictEqual('32px') - - const space1Btn1 = await page.locator('.ArrayItems nz-space').first().locator('a >> nth = 1') - let space1Btn1W = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - let space1Btn1H = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - let space1Btn1C = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - let space1Btn1LH = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - let space1Btn1M = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space1Btn1W).toStrictEqual('20') - await expect(space1Btn1H).toStrictEqual('32px') - await expect(space1Btn1C).toStrictEqual('rgb(34, 84, 157)') - await expect(space1Btn1LH).toStrictEqual('32px') - await expect(space1Btn1M).toStrictEqual('0px 0px 0px 12px') - - await space1Btn1.click() - - space1W = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - space1H = await space1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1W).toStrictEqual('549px') - await expect(space1H).toStrictEqual('52px') - - space1Input1W = await space1Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - space1Input1H = await space1Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1Input1W).toStrictEqual('346px') - await expect(space1Input1H).toStrictEqual('32px') - - space1Input2W = await space1Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - space1Input2H = await space1Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1Input2W).toStrictEqual('131px') - await expect(space1Input2H).toStrictEqual('32px') - - space1Btn1W = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - space1Btn1H = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - space1Btn1C = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - space1Btn1LH = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - space1Btn1M = await space1Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space1Btn1W).toStrictEqual('131px') - await expect(space1Btn1H).toStrictEqual('32px') - await expect(space1Btn1C).toStrictEqual('rgb(34, 84, 157)') - await expect(space1Btn1LH).toStrictEqual('32px') - await expect(space1Btn1M).toStrictEqual('0px 0px 0px 12px') - - const space2 = await page.locator('.ArrayItems nz-space >> nth = 1') - const space2W = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space2H = await space2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space2W).toStrictEqual('517px') - await expect(space2H).toStrictEqual('52px') - - const space2Input1 = await page.locator('.ArrayItems nz-space >> nth = 1').locator('input').first() - const space2Input1W = await space2Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space2Input1H = await space2Input1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space2Input1W).toStrictEqual('346px') - await expect(space2Input1H).toStrictEqual('32px') - - const space2Input2 = await page.locator('.ArrayItems nz-space >> nth = 1').locator('input >> nth = 1') - const space2Input2W = await space2Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space2Input2H = await space2Input2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space2Input2W).toStrictEqual('131px') - await expect(space2Input2H).toStrictEqual('32px') - - const space2Btn1 = await page.locator('.ArrayItems nz-space >> nth = 1').locator('a >> nth = 0') - const space2Btn1H = await space2Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2Btn1C = await space2Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const space2Btn1LH = await space2Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const space2Btn1M = await space2Btn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space2Btn1H).toStrictEqual('32px') - await expect(space2Btn1C).toStrictEqual('rgb(34, 84, 157)') - await expect(space2Btn1LH).toStrictEqual('32px') - await expect(space2Btn1M).toStrictEqual('0px 0px 0px 12px') - - const space2Btn2 = await page.locator('.ArrayItems nz-space >> nth = 1').locator('a >> nth = 1') - const space2Btn2W = await space2Btn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space2Btn2H = await space2Btn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space2Btn2C = await space2Btn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const space2Btn2LH = await space2Btn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const space2Btn2M = await space2Btn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(space2Btn2W).toStrictEqual('20') - await expect(space2Btn2H).toStrictEqual('32px') - await expect(space2Btn2C).toStrictEqual('rgb(34, 84, 157)') - await expect(space2Btn2LH).toStrictEqual('32px') - await expect(space2Btn2M).toStrictEqual('0px 0px 0px 12px') - - await space2Btn2.click() - - await page.getByText('引用环境变量').click() - - const space1Env = await page.locator('nz-space').first() - const space1EnvW = await space1Env.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space1EnvH = await space1Env.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1EnvW).toStrictEqual('430px') - await expect(space1EnvH).toStrictEqual('52px') - - const space1EnvInput = await page.getByPlaceholder('请输入环境变量').first() - const space1EnvInputW = await space1EnvInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const space1EnvInputH = await space1EnvInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - await expect(space1EnvInputW).toStrictEqual('346px') - await expect(space1EnvInputH).toStrictEqual('32px') - - const space1EnvA = await page.locator('#dynamic a').first() - const space1EnvAH = await space1EnvA.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const space1EnvAC = await space1EnvA.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const space1EnvALH = await space1EnvA.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('line-height')) - const space1EnvAFS = await space1EnvA.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - await expect(space1EnvAH).toStrictEqual('32px') - await expect(space1EnvAC).toStrictEqual('rgb(34, 84, 157)') - await expect(space1EnvALH).toStrictEqual('32px') - await expect(space1EnvAFS).toStrictEqual('12px') - - await space1EnvA.click() - const drawerListHeader = await page.locator('.drawer-list-header').first() - const drawerListHeaderH = await drawerListHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const drawerListHeaderW = await drawerListHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const drawerListHeaderP = await drawerListHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerListHeaderM = await drawerListHeader.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(drawerListHeaderH).toStrictEqual('44px') - await expect(drawerListHeaderW).toStrictEqual('636px') - await expect(drawerListHeaderP).toStrictEqual('0px 0px 12px 0px') - await expect(drawerListHeaderM).toStrictEqual('0px') - - const drawerListContent = await page.locator('.drawer-list-content').first() - const drawerListContentW = await drawerListContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const drawerListContentP = await drawerListContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerListContentM = await drawerListContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(drawerListContentW).toStrictEqual('636px') - await expect(drawerListContentP).toStrictEqual('0px 0px 20px 0px') - await expect(drawerListContentM).toStrictEqual('0px') - - const drawerPagination = await page.locator('.drawer-pagination').first() - const drawerPaginationW = await drawerPagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const drawerPaginationP = await drawerPagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - const drawerPaginationM = await drawerPagination.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - await expect(drawerPaginationW).toStrictEqual('636px') - await expect(drawerPaginationP).toStrictEqual('0px 0px 20px 0px') - await expect(drawerPaginationM).toStrictEqual('16px 0px 0px 0px') - - await page.getByRole('button', { name: '添加变量' }).click() - - const keyInputTd = await page.getByRole('cell', { name: '请输入KEY' }) - const keyInputTdVA = await keyInputTd.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('vertical-align')) - await expect(keyInputTdVA).toStrictEqual('middle') - - const keyInput = await page.getByRole('cell', { name: '请输入KEY' }).locator('input') - const keyInputH = await keyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const keyInputW = await keyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const keyInputBC = await keyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const keyInputBGC = await keyInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - await expect(keyInputH).toStrictEqual('32px') - await expect(keyInputW).toStrictEqual('268px') - await expect(keyInputBC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(keyInputBGC).toStrictEqual('rgba(0, 0, 0, 0)') - - const ValueInputTd = await page.getByRole('cell', { name: '请输入描述' }) - const ValueInputTdVA = await ValueInputTd.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('vertical-align')) - await expect(ValueInputTdVA).toStrictEqual('middle') - - const valueInput = await page.getByRole('cell', { name: '请输入KEY' }).locator('input') - const valueInputH = await valueInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const valueInputW = await valueInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const valueInputBC = await valueInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const valueInputBGC = await valueInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - await expect(valueInputH).toStrictEqual('32px') - await expect(valueInputW).toStrictEqual('268px') - await expect(valueInputBC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(valueInputBGC).toStrictEqual('rgba(0, 0, 0, 0)') - - const tdBtn1 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button').first() - const tdBtn1H = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const tdBtn1W = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const tdBtn1BC = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const tdBtn1BGC = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const tdBtn1M = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const tdBtn1P = await tdBtn1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - await expect(tdBtn1H).toStrictEqual('32px') - await expect(tdBtn1W).toStrictEqual('28px') - await expect(tdBtn1BC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(tdBtn1BGC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(tdBtn1M).toStrictEqual('0px') - await expect(tdBtn1P).toStrictEqual('0px 8px 0px 0px') - - const tdBtn2 = await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td').last().locator('button').last() - const tdBtn2H = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const tdBtn2W = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const tdBtn2BC = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('border-color')) - const tdBtn2BGC = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('background-color')) - const tdBtn2M = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin')) - const tdBtn2P = await tdBtn2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - await expect(tdBtn2H).toStrictEqual('32px') - await expect(tdBtn2W).toStrictEqual('28px') - await expect(tdBtn2BC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(tdBtn2BGC).toStrictEqual('rgba(0, 0, 0, 0)') - await expect(tdBtn2M).toStrictEqual('0px') - await expect(tdBtn2P).toStrictEqual('0px 0px 0px 8px') - - await page.locator('#dynamic a').click() - await page.getByRole('button', { name: '添加变量' }).click() - await page.getByRole('button', { name: '添加变量' }).dblclick() - await page.getByPlaceholder('请输入KEY').nth(2).click() - await page.getByRole('button', { name: '' }).nth(2).click() - await page.getByText('parameter error').click() - await page.getByPlaceholder('请输入KEY').nth(1).click() - await page.getByPlaceholder('请输入KEY').nth(1).fill('test') - await page.getByRole('button', { name: '' }).nth(1).first().click() - await page.getByRole('button', { name: 'Close' }).click() - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击新建上游,逐一填入必输项,点击保存', async () => { - await page.getByRole('button', { name: '新建上游' }).click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').click() - await page.getByPlaceholder('英文数字下划线任意一种,首字母必须为英文').fill('test') - await page.getByPlaceholder('请输入主机名或IP:端口').click() - await page.getByPlaceholder('请输入主机名或IP:端口').fill('test') - await page.getByPlaceholder('请输入权重').click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByPlaceholder('请输入权重').click() - await page.getByPlaceholder('请输入权重').fill('2') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-select#discoveryName').click() - await page.locator('eo-ng-option-item >> nth = 2').click() - await page.locator('input[type="text"]').click() - await page.locator('input[type="text"]').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('eo-ng-select#discoveryName').click() - await page.getByText('静态节点').click() - await page.getByText('引用环境变量').click() - await page.getByPlaceholder('请输入环境变量').click() - await page.getByPlaceholder('请输入环境变量').fill('test') - await page.getByRole('button', { name: '保存' }).click() - await page.locator('nz-space div').filter({ hasText: '引用环境变量' }).click() - await page.locator('eo-ng-upstream-create').click() - await page.getByText('保存 取消').click() - await page.locator('span').filter({ hasText: '引用环境变量' }).click() - await page.locator('eo-ng-upstream-create').click() - await page.locator('#dynamic a').click() - await page.getByRole('button', { name: '保存' }).click() - await page.getByRole('button', { name: '取消' }).click() - }) - it('点击上游列表中的某一项,进入上线管理,检查样式,点击面包屑返回列表页', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 0').click() - await page.getByText('上游管理 / 上线管理 /').click() - - const tab1 = await page.getByRole('link', { name: '上线管理' }) - const tab1FS = await tab1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-size')) - const tab1C = await tab1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - await expect(tab1FS).toStrictEqual('14px') - await expect(tab1C).toStrictEqual('rgb(34, 84, 157)') - - const listContent = await page.locator('.list-content') - const listContentMT = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - const listContentPB = await listContent.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-bottom')) - - const listTable = await page.locator('eo-ng-apinto-table') - const listTableMT = await listTable.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('margin-top')) - - expect(listContentMT).toStrictEqual('12px') - expect(listTableMT).toStrictEqual('0px') - expect(listContentPB).toStrictEqual('20px') - - const listTableTh1 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 0') - const listTableTh1Padding = await listTableTh1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh1Padding).toStrictEqual('0px 12px') - - const listTableTh2 = await page.locator('eo-ng-apinto-table tr >> nth = 0 >> th >> nth = 1') - const listTableTh2Padding = await listTableTh2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableTh2Padding).toStrictEqual('0px 12px') - - if (await (await page.$$('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5')).length === 2) { - const listTableIconTh = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5') - const listTableIconThPadding = await listTableIconTh.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding')) - expect(listTableIconThPadding).toStrictEqual('0px 24px 0px 12px') - - const listTableIcon1 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 0') - const listTableIcon1PL = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon1PR = await listTableIcon1.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon1PL).toStrictEqual('0px') - expect(listTableIcon1PR).toStrictEqual('8px') - - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button >> nth = 1') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('8px') - expect(listTableIcon2PR).toStrictEqual('0px') - } else { - const listTableIcon2 = await page.locator('eo-ng-apinto-table tr >> nth = 1 >> td >> nth = 5 >> button') - const listTableIcon2PL = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-left')) - const listTableIcon2PR = await listTableIcon2.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('padding-right')) - expect(listTableIcon2PL).toStrictEqual('0px') - expect(listTableIcon2PR).toStrictEqual('0px') - } - - const onlineText = await page.getByText('已上线') - if (await onlineText && await onlineText.isVisible()) { - const onlineTextC = await onlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const onlineTextFW = await onlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(onlineTextC).toStrictEqual('rgb(19, 137, 19)') - expect(onlineTextFW).toStrictEqual('700') - } - - const notgoonlineText = await page.getByText('未上线') - if (await notgoonlineText && await notgoonlineText.isVisible()) { - const notgoonlineTextC = await notgoonlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const notgoonlineTextFW = await notgoonlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(notgoonlineTextC).toStrictEqual('rgb(143, 142, 147)') - expect(notgoonlineTextFW).toStrictEqual('700') - } - - const toUpdateText = await page.getByText('待更新') - if (await toUpdateText && await toUpdateText.isVisible()) { - const toUpdateTextC = await toUpdateText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const toUpdateTextFW = await toUpdateText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(toUpdateTextC).toStrictEqual('rgb(3, 169, 244)') - expect(toUpdateTextFW).toStrictEqual('700') - } - - const offlineText = await page.getByText('已下线') - if (await offlineText && await offlineText.isVisible()) { - const offlineTextC = await offlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('color')) - const offlineTextFW = await offlineText.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('font-weight')) - expect(offlineTextC).toStrictEqual('rgb(143, 142, 147)') - expect(offlineTextFW).toStrictEqual('700') - } - await page.locator('nz-breadcrumb').getByRole('link', { name: '上游管理' }).click() - }) - it('点击上游列表中的某一项,进入上游管理页,点击tab切换至上游信息页,检查样式,修改并提交', async () => { - await page.locator('eo-ng-apinto-table tr >> nth = 2 >> td >> nth = 1').click() - await page.getByRole('link', { name: '上游信息' }).click() - - // 上游名称输入框样式 - const nameInput = await page.locator('input#name') - const nameInputW = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('width')) - const nameInputH = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('height')) - const nameInputD = await nameInput.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - - await expect(nameInputW).toStrictEqual('346px') - await expect(nameInputH).toStrictEqual('32px') - await expect(nameInputD).toStrictEqual('true') - - await page.locator('#desc').click() - await page.locator('#desc').fill('testt') - await page.getByRole('button', { name: '提交' }).click() - }) - it('点击上游列表中的某一项的查看图标,进入上线管理页,检查tab;通过面包屑返回列表页', async () => { - await page.getByRole('button', { name: '' }).first().click() - await page.getByRole('link', { name: '上游信息' }).click() - await page.getByRole('link', { name: '上线管理' }).click() - await page.getByRole('link', { name: '上游信息' }).click() - await page.locator('nz-breadcrumb').getByText('上游信息').click() - await page.getByRole('link', { name: '上线管理' }).click() - await page.getByRole('link', { name: '上游信息' }).click() - await page.getByRole('link', { name: '上线管理' }).click() - await page.locator('nz-breadcrumb').getByRole('link', { name: '上游管理' }).click() - await page.getByRole('button', { name: '' }).last().click() - const deleteBtn = page.getByRole('button', { name: '' }).last() - const deleteBtnD = await deleteBtn.evaluate((element) => - window.getComputedStyle(element).getPropertyValue('disabled')) - if (deleteBtnD !== 'true') { - await deleteBtn.click() - await page.getByText('该数据删除后将无法找回,请确认是否删除?').click() - await page.locator('ant-modal-footer').getByRole('button', { name: '取消' }).click() - await deleteBtn.click() - await page.getByText('该数据删除后将无法找回,请确认是否删除?').click() - await page.locator('ant-modal-footer').getByRole('button', { name: '确认' }).click() - } - }) -}) diff --git a/frontend/projects/core/src/app/service/api.service.spec.ts b/frontend/projects/core/src/app/service/api.service.spec.ts deleted file mode 100644 index 766c816bb..000000000 --- a/frontend/projects/core/src/app/service/api.service.spec.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* - * @Author: MengjieYang yangmengjie@eolink.com - * @Date: 2022-08-07 21:45:15 - * @LastEditors: MengjieYang yangmengjie@eolink.com - * @LastEditTime: 2022-08-07 23:21:55 - * @FilePath: /apinto/src/app/service/api.service.spec.ts - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -// Http testing module and mocking controller -import { - HttpClientTestingModule, - HttpTestingController -} from '@angular/common/http/testing' - -// Other imports -import { TestBed } from '@angular/core/testing' -import { HttpErrorResponse } from '@angular/common/http' -import { Data } from '@angular/router' -import { ApiService, API_URL } from './api.service' -import { Overlay } from '@angular/cdk/overlay' -import { APP_BASE_HREF } from '@angular/common' -import { EoNgFeedbackMessageService } from 'eo-ng-feedback' -import { environment } from 'projects/core/src/environments/environment' - -class MockMessageService { - error () { - return 'error' - } -} - -describe('HttpClient testing', () => { - let service: ApiService - let httpTestingController: HttpTestingController - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [ - ApiService, - { provide: Overlay, useClass: Overlay }, - { provide: APP_BASE_HREF, useValue: '/' }, - { provide: API_URL, useValue: environment.urlPrefix }, - { provide: EoNgFeedbackMessageService, useClass: MockMessageService } - ] - }) - - // Inject the http service and test controller for each test - service = TestBed.inject(ApiService) - httpTestingController = TestBed.inject(HttpTestingController) - }) - - /// Tests begin /// - - it('can test HttpClient.get', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.get('clusters').subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - // The following `expectOne()` will match the request's URL. - // If no requests or multiple requests matched that URL - // `expectOne()` would throw. - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - - // Assert that the request is a GET. - expect(req.request.method).toEqual('GET') - - // Respond with mock data, causing Observable to resolve. - // Subscribe callback asserts that correct data was returned. - req.flush(testData) - - // Finally, assert that there are no outstanding requests. - httpTestingController.verify() - }) - - it('can test HttpClient.get with params', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service - .get('clusters', { namespace: 'test', query: { test: 1 } }) - .subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default&query=%7B%22test%22:1%7D' - ) - - expect(req.request.method).toEqual('GET') - req.flush(testData) - httpTestingController.verify() - }) - - it('can test HttpClient.post', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.post('clusters').subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - expect(req.request.method).toEqual('POST') - req.flush(testData) - httpTestingController.verify() - }) - - it('can test HttpClient.post with params', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.post('clusters', { namespace: 'test' }).subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - expect(req.request.method).toEqual('POST') - req.flush(testData) - httpTestingController.verify() - }) - - it('can test HttpClient.put', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.put('clusters').subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - - expect(req.request.method).toEqual('PUT') - - req.flush(testData) - - httpTestingController.verify() - }) - - it('can test HttpClient.put', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.put('clusters', { namespace: 'test' }).subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - expect(req.request.method).toEqual('PUT') - req.flush(testData) - httpTestingController.verify() - }) - - it('can test HttpClient.delete', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.delete('clusters').subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - - expect(req.request.method).toEqual('DELETE') - - req.flush(testData) - - httpTestingController.verify() - }) - - it('can test HttpClient.delete with params', () => { - const testData: Data = { name: 'Test Data' } - - // Make an HTTP GET request - service.delete('clusters', { namespace: 'test' }).subscribe((data) => - // When observable resolves, result should match test data - expect(data).toEqual(testData) - ) - const req = httpTestingController.expectOne( - 'https://mockapi.eolink.com/K25EPjsf31dac8880a551fe2672247d21218bf854cbcf60/api/clusters?namespace=default' - ) - expect(req.request.method).toEqual('DELETE') - req.flush(testData) - httpTestingController.verify() - }) - - it('handleError', () => { - const err1 = new HttpErrorResponse({ error: { text: 'test' }, status: 0 }) - const messagService = TestBed.inject(EoNgFeedbackMessageService) - const spyService = jest.spyOn(messagService, 'error') - expect(spyService).not.toBeCalled() - service.handleError(err1) - expect(spyService).toBeCalled() - - const err2 = new HttpErrorResponse({ error: { text: 'test' }, status: 1 }) - service.handleError(err2) - expect(spyService).toHaveBeenCalledTimes(2) - }) -}) diff --git a/frontend/projects/eo-ng-apinto-table/src/lib/table/table.component.spec.ts b/frontend/projects/eo-ng-apinto-table/src/lib/table/table.component.spec.ts deleted file mode 100644 index f2ab5296c..000000000 --- a/frontend/projects/eo-ng-apinto-table/src/lib/table/table.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' - -import { TableComponent } from './table.component' - -describe('TableComponent', () => { - let component: TableComponent - let fixture: ComponentFixture - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [TableComponent] - }) - .compileComponents() - - fixture = TestBed.createComponent(TableComponent) - component = fixture.componentInstance - fixture.detectChanges() - }) - - it('should create', () => { - expect(component).toBeTruthy() - }) -}) diff --git a/go.mod b/go.mod index 435762a68..004a2bf13 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,7 @@ module github.com/eolinker/apinto-dashboard go 1.18 require ( - github.com/eolinker/apinto-business v0.0.0-00010101000000-000000000000 - github.com/eolinker/eosc v0.12.1 + github.com/eolinker/eosc v0.14.1 github.com/gin-gonic/gin v1.9.0 github.com/go-basic/uuid v1.0.0 github.com/go-redis/redis/v8 v8.11.5 @@ -69,7 +68,3 @@ require ( google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect ) - -replace github.com/eolinker/eosc => ../eosc - -replace github.com/eolinker/apinto-business => ../apinto-business diff --git a/go.sum b/go.sum index 4fc1dc347..3a0c319f6 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/eolinker/eosc v0.14.1 h1:gIDAZ6u/FHSpu2BfrX31zqdaN6AZffRZcmcXR68+xnA= +github.com/eolinker/eosc v0.14.1/go.mod h1:YlNUCH8IKRUzZOc0PJPAHJTAAlhUU7B5nJh9q+Vj7ts= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=