Collection actionPlan -> activity (labels "Atividade"/"Atividades"), campo
campaignDemand.actionPlan -> activity, rota /campanha/planos ->
/campanha/atividades (criacao em atividades/nova), sidebar "Atividades" e
rotulos alinhados a entidade ("Tipo de atividade", "Origem da atividade",
"Resultado da atividade"). Valores de enum kind/status/origin inalterados.
Schema movido por migration data-preserving escrita a mao
(20260725_213000_rename_action_plan_to_activity): 4 tabelas, 3 enums, 2
colunas, 39 indices (4 pkeys inclusos), 14 FKs e 2 sequences, cada statement
guardado na existencia do objeto de origem, com down() simetrico. O gerador do
Payload emitiria DROP+CREATE e nao ve o indice parcial escrito a mao
action_plan_upcoming_start_at_idx, entao a lista veio de
pg_indexes/pg_constraint/pg_type/pg_sequences e o snapshot .json foi derivado
do anterior por transformacao textual -- validado por migrate:create __probe
sem mudanca de schema. A mesma migration alinha os 8 indices fosseis %plaza%
que a remodelagem de municipios deixou (renomeou as colunas plaza_id, nao os
indices).
Guard: o describe "banned campaign terminology" de
codebaseConventions.unit.spec.ts virou tabela de termos varrendo src+tests+
scripts (migrations fora -- historia congelada), banindo os compostos
actionPlan, a copy "plano de acao" e a rota antiga, mas nao plan/plano isolado
(colidiria com os planos de assinatura da Fase 2). Allowlist: o proprio spec,
scripts/generate-remodel-municipalities-migration.mjs e o comentario historico
em campaignMigrationReconciliation.int.spec.ts.
Plano: docs/plans/renomear-plano-acao-para-atividade.md
65 lines
3.1 KiB
TypeScript
65 lines
3.1 KiB
TypeScript
import { expect, test } from './fixtures/campaignE2EFixtures.js'
|
|
|
|
test.describe('Atividades — registro-fundação', () => {
|
|
test.setTimeout(90_000)
|
|
|
|
test('registra origem, cria demandas vinculadas e exibe a explicação dos sinais', async ({
|
|
campaign,
|
|
page,
|
|
}) => {
|
|
const { fixtures } = campaign
|
|
const password = fixtures.value('senha')
|
|
const coordinator = await campaign.payload.create({
|
|
collection: 'campaignUser',
|
|
data: {
|
|
name: fixtures.value('Coordenadora Geral'),
|
|
email: `${fixtures.value('coordinator')}@example.com`,
|
|
password,
|
|
role: 'coordinator',
|
|
},
|
|
depth: 0,
|
|
})
|
|
const municipality = await fixtures.claimMunicipality()
|
|
const activityTitle = fixtures.value('Giro territorial')
|
|
const transportDemand = fixtures.value('Transporte para equipe')
|
|
const materialDemand = fixtures.value('Material de rua')
|
|
|
|
await campaign.login(page, coordinator.email!, password)
|
|
await page.goto(`${campaign.baseURL}/campanha/atividades/nova`)
|
|
|
|
await page.getByLabel('Título *').fill(activityTitle)
|
|
await page.getByLabel('Tipo de atividade *').selectOption('caminhada')
|
|
await page.getByLabel('Origem da atividade').selectOption('obrigacao_politica')
|
|
await page.getByLabel('Município *').selectOption(String(municipality.id))
|
|
|
|
await page.getByRole('button', { name: 'Adicionar demanda' }).click()
|
|
await page.getByLabel('Título da demanda 1').fill(transportDemand)
|
|
await page.getByLabel('Tipo da demanda 1').selectOption('transporte')
|
|
await page.getByRole('button', { name: 'Adicionar demanda' }).click()
|
|
await page.getByLabel('Título da demanda 2').fill(materialDemand)
|
|
await page.getByLabel('Tipo da demanda 2').selectOption('material')
|
|
|
|
await page.getByRole('button', { name: 'Criar atividade' }).click()
|
|
await expect(page).toHaveURL(/\/campanha\/atividades\/[^/?]+$/)
|
|
await expect(page.getByRole('heading', { name: activityTitle })).toBeVisible({
|
|
timeout: 15_000,
|
|
})
|
|
await expect(page.getByText('Obrigação política', { exact: true })).toBeVisible()
|
|
await expect(page.getByRole('link', { name: transportDemand })).toBeVisible()
|
|
await expect(page.getByRole('link', { name: materialDemand })).toBeVisible()
|
|
|
|
await page.getByRole('link', { name: 'Adicionar demanda' }).click()
|
|
await expect(page.getByLabel('Atividade relacionada')).toHaveValue(/\d+/)
|
|
await expect(page.getByLabel('Município')).toHaveValue(String(municipality.id))
|
|
|
|
await page.goto(`${campaign.baseURL}/campanha/municipios/${municipality.slug}?tab=updates`)
|
|
await page.getByLabel('Tipo', { exact: true }).selectOption('sinal')
|
|
await expect(page.getByText('Invasão:', { exact: true })).toBeVisible()
|
|
await expect(
|
|
page.getByText('Adversário ocupando ou ganhando espaço antes dominado pela campanha.'),
|
|
).toBeVisible()
|
|
await expect(page.getByText('Esfriamento:', { exact: true })).toBeVisible()
|
|
await expect(page.getByText('Visita adversária:', { exact: true })).toBeVisible()
|
|
await expect(page.getByText('Proposta a broker:', { exact: true })).toBeVisible()
|
|
})
|
|
})
|