# tests.py

import subprocess
import json
from django.test import TestCase
from django.conf import settings

class JWTAuthenticationTests(TestCase):
    

    def run_httpie_command(self, command):
        result = subprocess.run(command, shell=True, capture_output=True, text=True)
        return result.stdout, result.stderr, result.returncode

    def test_jwt_authentication_flow(self):
        #Get http_domain from settings
        http_domain = settings.TEST_HTTP_DOMAIN or 'http://127.0.0.1:8000'
        # Get email and password from settings
        email = settings.TEST_USER_EMAIL or 'default_email@test.com'
        password = settings.TEST_USER_PASSWORD or 'default_password'

        
        # Step 1: Login
        login_command = f"http POST {http_domain}/auth/register/login/ email='{email}' password='{password}'"
        login_stdout, login_stderr, login_returncode = self.run_httpie_command(login_command)

        self.assertEqual(login_returncode, 0, f"Login failed: {login_stderr}")
        login_response = json.loads(login_stdout)
        self.assertIn('access_token', login_response, "Login response does not contain access token")
        self.assertIn('refresh_token', login_response, "Login response does not contain refresh token")

        token = login_response['access_token']
        refresh = login_response['refresh_token']

        # Step 2: Check Token Validity
        check_command = f"http POST {http_domain}/auth/register/check/ token='{token}'"
        check_stdout, check_stderr, check_returncode = self.run_httpie_command(check_command)

        self.assertEqual(check_returncode, 0, f"Token check failed: {check_stderr}")
        self.assertIn("Access granted", check_stdout, "Token check response is not successful")

        # Step 3: Logout
        logout_command = f"http POST {http_domain}/auth/register/logout/ token='{token}'"
        logout_stdout, logout_stderr, logout_returncode = self.run_httpie_command(logout_command)

        self.assertEqual(logout_returncode, 0, f"Logout failed: {logout_stderr}")
        self.assertIn("Token blacklisted successfully", logout_stdout, "Logout response is not successful")

        # Step 4: Refresh Token
        refresh_command = f"http POST {http_domain}/auth/register/refresh/ refresh_token={refresh}"
        refresh_stdout, refresh_stderr, refresh_returncode = self.run_httpie_command(refresh_command)

        self.assertEqual(refresh_returncode, 0, f"Token refresh failed: {refresh_stderr}")
        refresh_response = json.loads(refresh_stdout)
        self.assertIn('access_token', refresh_response, "Refresh response does not contain new access token")

        new_token = refresh_response['access_token']
        #print(f"New Token: {new_token}")
