"""Testes para as rotas de autenticação."""

import unittest
from flask import url_for
from src import create_app
from src.models import db, User
from src.config import config

class TestConfig:
    """Configuração de teste."""
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SECRET_KEY = 'test-key'
    WTF_CSRF_ENABLED = False

class TestAuth(unittest.TestCase):
    """Testes para as rotas de autenticação."""

    def setUp(self):
        """Configuração inicial para cada teste."""
        self.app = create_app('test')
        self.app.config.from_object(TestConfig)
        self.client = self.app.test_client()
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()

    def tearDown(self):
        """Limpeza após cada teste."""
        db.session.remove()
        db.drop_all()
        self.app_context.pop()

    def test_register_success(self):
        """Testa o registro bem-sucedido de um usuário."""
        response = self.client.post('/register', data={
            'username': 'testuser',
            'password': 'testpass'
        }, follow_redirects=True)
        self.assertEqual(response.status_code, 200)
        
        user = User.query.filter_by(username='testuser').first()
        self.assertIsNotNone(user)
        self.assertTrue(user.check_password('testpass'))

    def test_register_duplicate_username(self):
        """Testa o registro com nome de usuário duplicado."""
        self.client.post('/register', data={
            'username': 'testuser',
            'password': 'testpass'
        })
        response = self.client.post('/register', data={
            'username': 'testuser',
            'password': 'testpass2'
        }, follow_redirects=True)
        self.assertEqual(response.status_code, 200)
        users = User.query.filter_by(username='testuser').all()
        self.assertEqual(len(users), 1)

    def test_login_success(self):
        """Testa o login bem-sucedido."""
        user = User(username='testuser')
        user.set_password('testpass')
        db.session.add(user)
        db.session.commit()
        response = self.client.post('/login', data={
            'username': 'testuser',
            'password': 'testpass'
        }, follow_redirects=True)
        self.assertEqual(response.status_code, 200)

    def test_login_invalid_credentials(self):
        """Testa o login com credenciais inválidas."""
        response = self.client.post('/login', data={
            'username': 'nonexistent',
            'password': 'wrongpass'
        }, follow_redirects=True)
        self.assertEqual(response.status_code, 200)

    def test_logout(self):
        """Testa o logout."""
        user = User(username='testuser')
        user.set_password('testpass')
        db.session.add(user)
        db.session.commit()
        
        self.client.post('/login', data={
            'username': 'testuser',
            'password': 'testpass'
        })
        
        response = self.client.get('/logout', follow_redirects=True)
        self.assertEqual(response.status_code, 200)

    def test_api_login_success(self):
        """Testa o login via API com sucesso."""
        user = User(username='testuser')
        user.set_password('testpass')
        db.session.add(user)
        db.session.commit()
        response = self.client.post('/login', 
            json={
                'username': 'testuser',
                'password': 'testpass'
            },
            headers={'Content-Type': 'application/json'}
        )
        self.assertEqual(response.status_code, 200)
        self.assertIn('message', response.json)
        self.assertEqual(response.json['message'], 'Login successful')

    def test_api_login_invalid_credentials(self):
        """Testa o login via API com credenciais inválidas."""
        response = self.client.post('/login',
            json={
                'username': 'nonexistent',
                'password': 'wrongpass'
            },
            headers={'Content-Type': 'application/json'}
        )
        self.assertEqual(response.status_code, 401)
        self.assertIn('error', response.json)
        self.assertEqual(response.json['error'], 'Invalid credentials')

if __name__ == '__main__':
    unittest.main()
