feat: implementa sistema de responsabilidades e instâncias - Adiciona responsabilidades de Finanças e Imprensa para todas as instâncias - Cria templates genéricos para gerenciamento de instâncias - Implementa sistema de permissões baseado em RBAC - Adiciona status de Aspirante com avaliação obrigatória - Atualiza documentação com novas regras e responsabilidades - Cria testes para validação das permissões - Adiciona migração para novos campos no banco de dados

This commit is contained in:
LS
2025-04-03 15:58:07 -03:00
parent 8dac8dc234
commit cbaf227e58
37 changed files with 4305 additions and 953 deletions

205
tests/test_permissions.py Normal file
View File

@@ -0,0 +1,205 @@
import unittest
from flask import Flask, g
from functions.database import db, Militante, Celula, Setor, CR, CC
from functions.permissions import (
can_manage_militante, can_manage_celula, can_manage_setor, can_manage_cr, can_manage_cc,
can_manage_financas, can_manage_imprensa, can_manage_responsabilidades
)
class TestPermissions(unittest.TestCase):
def setUp(self):
self.app = Flask(__name__)
self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
self.app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(self.app)
with self.app.app_context():
db.create_all()
# Criar instâncias
self.cc = CC(nome='CC 1')
db.session.add(self.cc)
self.cr = CR(nome='CR 1', cc=self.cc)
db.session.add(self.cr)
self.setor = Setor(nome='Setor 1', cr=self.cr)
db.session.add(self.setor)
self.celula = Celula(nome='Célula 1', setor=self.setor)
db.session.add(self.celula)
# Criar militantes com diferentes responsabilidades
self.militante_basico = Militante(
nome='Militante Básico',
email='basico@example.com',
celula=self.celula,
responsabilidades=Militante.MILITANTE_BASICO
)
db.session.add(self.militante_basico)
self.secretario_celula = Militante(
nome='Secretário de Célula',
email='celula@example.com',
celula=self.celula,
responsabilidades=Militante.SECRETARIO_CELULA
)
db.session.add(self.secretario_celula)
self.secretario_setor = Militante(
nome='Secretário de Setor',
email='setor@example.com',
celula=self.celula,
responsabilidades=Militante.SECRETARIO_SETOR
)
db.session.add(self.secretario_setor)
self.secretario_cr = Militante(
nome='Secretário de CR',
email='cr@example.com',
celula=self.celula,
responsabilidades=Militante.SECRETARIO_CR
)
db.session.add(self.secretario_cr)
self.secretario_cc = Militante(
nome='Secretário de CC',
email='cc@example.com',
celula=self.celula,
responsabilidades=Militante.SECRETARIO_CC
)
db.session.add(self.secretario_cc)
self.secretario_geral = Militante(
nome='Secretário Geral',
email='geral@example.com',
celula=self.celula,
responsabilidades=Militante.SECRETARIO_GERAL
)
db.session.add(self.secretario_geral)
self.responsavel_financas = Militante(
nome='Responsável de Finanças',
email='financas@example.com',
celula=self.celula,
responsabilidades=Militante.RESPONSAVEL_FINANCAS
)
db.session.add(self.responsavel_financas)
self.responsavel_imprensa = Militante(
nome='Responsável de Imprensa',
email='imprensa@example.com',
celula=self.celula,
responsabilidades=Militante.RESPONSAVEL_IMPRENSA
)
db.session.add(self.responsavel_imprensa)
# Atribuir responsáveis às instâncias
self.celula.responsavel_geral = self.secretario_celula
self.celula.responsavel_financas = self.responsavel_financas
self.celula.responsavel_imprensa = self.responsavel_imprensa
self.setor.responsavel_geral = self.secretario_setor
self.setor.responsavel_financas = self.responsavel_financas
self.setor.responsavel_imprensa = self.responsavel_imprensa
self.cr.responsavel_geral = self.secretario_cr
self.cr.responsavel_financas = self.responsavel_financas
self.cr.responsavel_imprensa = self.responsavel_imprensa
self.cc.responsavel_geral = self.secretario_cc
self.cc.responsavel_financas = self.responsavel_financas
self.cc.responsavel_imprensa = self.responsavel_imprensa
db.session.commit()
def test_can_manage_militante(self):
with self.app.app_context():
# Militante básico não pode gerenciar outros militantes
g.user = type('User', (), {'militante': self.militante_basico})
self.assertFalse(can_manage_militante(self.militante_basico.id))
# Secretário de célula pode gerenciar militantes da sua célula
g.user = type('User', (), {'militante': self.secretario_celula})
self.assertTrue(can_manage_militante(self.militante_basico.id))
# Secretário de setor pode gerenciar militantes do seu setor
g.user = type('User', (), {'militante': self.secretario_setor})
self.assertTrue(can_manage_militante(self.militante_basico.id))
# Secretário de CR pode gerenciar militantes do seu CR
g.user = type('User', (), {'militante': self.secretario_cr})
self.assertTrue(can_manage_militante(self.militante_basico.id))
# Secretário de CC pode gerenciar militantes do seu CC
g.user = type('User', (), {'militante': self.secretario_cc})
self.assertTrue(can_manage_militante(self.militante_basico.id))
# Secretário Geral pode gerenciar qualquer militante
g.user = type('User', (), {'militante': self.secretario_geral})
self.assertTrue(can_manage_militante(self.militante_basico.id))
def test_can_manage_financas(self):
with self.app.app_context():
# Militante básico não pode gerenciar finanças
g.user = type('User', (), {'militante': self.militante_basico})
self.assertFalse(can_manage_financas(self.celula.id, 'celula'))
# Responsável de finanças pode gerenciar finanças da sua instância
g.user = type('User', (), {'militante': self.responsavel_financas})
self.assertTrue(can_manage_financas(self.celula.id, 'celula'))
self.assertTrue(can_manage_financas(self.setor.id, 'setor'))
self.assertTrue(can_manage_financas(self.cr.id, 'cr'))
self.assertTrue(can_manage_financas(self.cc.id, 'cc'))
# Secretário Geral pode gerenciar finanças de qualquer instância
g.user = type('User', (), {'militante': self.secretario_geral})
self.assertTrue(can_manage_financas(self.celula.id, 'celula'))
self.assertTrue(can_manage_financas(self.setor.id, 'setor'))
self.assertTrue(can_manage_financas(self.cr.id, 'cr'))
self.assertTrue(can_manage_financas(self.cc.id, 'cc'))
def test_can_manage_imprensa(self):
with self.app.app_context():
# Militante básico não pode gerenciar imprensa
g.user = type('User', (), {'militante': self.militante_basico})
self.assertFalse(can_manage_imprensa(self.celula.id, 'celula'))
# Responsável de imprensa pode gerenciar imprensa da sua instância
g.user = type('User', (), {'militante': self.responsavel_imprensa})
self.assertTrue(can_manage_imprensa(self.celula.id, 'celula'))
self.assertTrue(can_manage_imprensa(self.setor.id, 'setor'))
self.assertTrue(can_manage_imprensa(self.cr.id, 'cr'))
self.assertTrue(can_manage_imprensa(self.cc.id, 'cc'))
# Secretário Geral pode gerenciar imprensa de qualquer instância
g.user = type('User', (), {'militante': self.secretario_geral})
self.assertTrue(can_manage_imprensa(self.celula.id, 'celula'))
self.assertTrue(can_manage_imprensa(self.setor.id, 'setor'))
self.assertTrue(can_manage_imprensa(self.cr.id, 'cr'))
self.assertTrue(can_manage_imprensa(self.cc.id, 'cc'))
def test_can_manage_responsabilidades(self):
with self.app.app_context():
# Militante básico não pode gerenciar responsabilidades
g.user = type('User', (), {'militante': self.militante_basico})
self.assertFalse(can_manage_responsabilidades(self.militante_basico.id))
# Secretário de setor pode gerenciar responsabilidades do seu setor
g.user = type('User', (), {'militante': self.secretario_setor})
self.assertTrue(can_manage_responsabilidades(self.militante_basico.id))
# Secretário de CR pode gerenciar responsabilidades do seu CR
g.user = type('User', (), {'militante': self.secretario_cr})
self.assertTrue(can_manage_responsabilidades(self.militante_basico.id))
# Secretário de CC pode gerenciar responsabilidades do seu CC
g.user = type('User', (), {'militante': self.secretario_cc})
self.assertTrue(can_manage_responsabilidades(self.militante_basico.id))
# Secretário Geral pode gerenciar responsabilidades de qualquer militante
g.user = type('User', (), {'militante': self.secretario_geral})
self.assertTrue(can_manage_responsabilidades(self.militante_basico.id))
if __name__ == '__main__':
unittest.main()