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:
205
tests/test_permissions.py
Normal file
205
tests/test_permissions.py
Normal 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()
|
||||
Reference in New Issue
Block a user