kin: KIN-075 Расширить канбан-вид до ширины экрана, сейчас он ограничен центром. + добавить кнопки Тас Аудит Автокомит Авто в канбан вид
This commit is contained in:
parent
9764d1b414
commit
394301c7a7
4 changed files with 205 additions and 6 deletions
55
web/frontend/src/__tests__/app-layout.test.ts
Normal file
55
web/frontend/src/__tests__/app-layout.test.ts
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* KIN-075: Тест полной ширины экрана
|
||||
* Проверяет что App.vue не ограничивает ширину контента — нет max-w-* на <main>
|
||||
*/
|
||||
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||
import { mount, flushPromises } from '@vue/test-utils'
|
||||
import { createRouter, createMemoryHistory } from 'vue-router'
|
||||
import App from '../App.vue'
|
||||
|
||||
vi.mock('../components/EscalationBanner.vue', () => ({
|
||||
default: { template: '<div />' },
|
||||
}))
|
||||
|
||||
function makeRouter() {
|
||||
return createRouter({
|
||||
history: createMemoryHistory(),
|
||||
routes: [
|
||||
{ path: '/', component: { template: '<div>home</div>' } },
|
||||
{ path: '/settings', component: { template: '<div>settings</div>' } },
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
})
|
||||
|
||||
describe('KIN-075: App.vue — полная ширина экрана', () => {
|
||||
it('<main> не содержит класс max-w-* — контент не ограничен по ширине', async () => {
|
||||
const router = makeRouter()
|
||||
await router.push('/')
|
||||
|
||||
const wrapper = mount(App, { global: { plugins: [router] } })
|
||||
await flushPromises()
|
||||
|
||||
const main = wrapper.find('main')
|
||||
expect(main.exists(), '<main> должен существовать в App.vue').toBe(true)
|
||||
expect(
|
||||
main.classes().some(c => c.startsWith('max-w-')),
|
||||
'<main> не должен иметь ограничивающий класс max-w-*',
|
||||
).toBe(false)
|
||||
})
|
||||
|
||||
it('<main> не содержит класс max-w-6xl (регрессия KIN-075)', async () => {
|
||||
const router = makeRouter()
|
||||
await router.push('/')
|
||||
|
||||
const wrapper = mount(App, { global: { plugins: [router] } })
|
||||
await flushPromises()
|
||||
|
||||
const main = wrapper.find('main')
|
||||
expect(main.classes()).not.toContain('max-w-6xl')
|
||||
})
|
||||
})
|
||||
|
|
@ -561,3 +561,88 @@ describe('KIN-UI-001: регрессии — другие вкладки не с
|
|||
expect(wrapper.text()).toContain('No modules')
|
||||
})
|
||||
})
|
||||
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// KIN-075: кнопки управления в канбан-виде
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
|
||||
describe('KIN-075: канбан — кнопки управления', () => {
|
||||
it('Кнопка переключения режима (Авто/Review) присутствует в канбан-виде', async () => {
|
||||
const wrapper = await mountOnKanban()
|
||||
// MOCK_PROJECT.execution_mode = 'review' → autoMode=false → title = 'Review mode: agents read-only'
|
||||
const modeBtn = wrapper.find('button[title*="mode:"]')
|
||||
expect(modeBtn.exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('Кнопка Автокомит присутствует в канбан-виде', async () => {
|
||||
const wrapper = await mountOnKanban()
|
||||
// MOCK_PROJECT.autocommit_enabled = 0 → autocommit=false → title = 'Autocommit: off'
|
||||
const btn = wrapper.find('button[title*="Autocommit:"]')
|
||||
expect(btn.exists()).toBe(true)
|
||||
expect(btn.text()).toMatch(/Автокомит/)
|
||||
})
|
||||
|
||||
it('Кнопка Аудит присутствует в канбан-виде', async () => {
|
||||
const wrapper = await mountOnKanban()
|
||||
const btn = wrapper.find('button[title="Check which pending tasks are already done"]')
|
||||
expect(btn.exists()).toBe(true)
|
||||
expect(btn.text()).toContain('Аудит')
|
||||
})
|
||||
|
||||
it('Кнопка "+ Тас" присутствует в канбан-виде', async () => {
|
||||
const wrapper = await mountOnKanban()
|
||||
const tasBtn = wrapper.findAll('button').find(b => b.text() === '+ Тас')
|
||||
expect(tasBtn?.exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('Клик на кнопку режима вызывает api.patchProject с execution_mode', async () => {
|
||||
vi.mocked(api.patchProject).mockResolvedValue(undefined as any)
|
||||
const wrapper = await mountOnKanban()
|
||||
|
||||
const modeBtn = wrapper.find('button[title*="mode:"]')
|
||||
await modeBtn.trigger('click')
|
||||
await flushPromises()
|
||||
|
||||
expect(vi.mocked(api.patchProject)).toHaveBeenCalledWith(
|
||||
'KIN',
|
||||
expect.objectContaining({ execution_mode: expect.any(String) }),
|
||||
)
|
||||
})
|
||||
|
||||
it('Клик на кнопку Автокомит вызывает api.patchProject с autocommit_enabled', async () => {
|
||||
vi.mocked(api.patchProject).mockResolvedValue(undefined as any)
|
||||
const wrapper = await mountOnKanban()
|
||||
|
||||
const btn = wrapper.find('button[title*="Autocommit:"]')
|
||||
await btn.trigger('click')
|
||||
await flushPromises()
|
||||
|
||||
expect(vi.mocked(api.patchProject)).toHaveBeenCalledWith(
|
||||
'KIN',
|
||||
expect.objectContaining({ autocommit_enabled: expect.anything() }),
|
||||
)
|
||||
})
|
||||
|
||||
it('Клик на кнопку Аудит вызывает api.auditProject', async () => {
|
||||
vi.mocked(api.auditProject).mockResolvedValue({
|
||||
success: true, already_done: [], still_pending: [], unclear: [],
|
||||
} as any)
|
||||
const wrapper = await mountOnKanban()
|
||||
|
||||
const auditBtn = wrapper.find('button[title="Check which pending tasks are already done"]')
|
||||
await auditBtn.trigger('click')
|
||||
await flushPromises()
|
||||
|
||||
expect(vi.mocked(api.auditProject)).toHaveBeenCalledWith('KIN')
|
||||
})
|
||||
|
||||
it('Клик на "+ Тас" открывает модальное окно Add Task', async () => {
|
||||
const wrapper = await mountOnKanban()
|
||||
|
||||
const tasBtn = wrapper.findAll('button').find(b => b.text() === '+ Тас')!
|
||||
await tasBtn.trigger('click')
|
||||
await flushPromises()
|
||||
|
||||
expect(wrapper.text()).toContain('Add Task')
|
||||
})
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue