kin: KIN-075 Расширить канбан-вид до ширины экрана, сейчас он ограничен центром. + добавить кнопки Тас Аудит Автокомит Авто в канбан вид

This commit is contained in:
Gros Frumos 2026-03-16 10:28:06 +02:00
parent 9764d1b414
commit 394301c7a7
4 changed files with 205 additions and 6 deletions

View 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')
})
})

View file

@ -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')
})
})