from django.test import TestCase
from django.contrib.auth import get_user_model
from rest_framework.test import APIClient
from rest_framework import status
from django.urls import reverse
from posts.models import Post
from categories.models import Category

User = get_user_model()

class SearchPostsTestCase(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.user = User.objects.create_user(
            username='searchuser',
            email='search@example.com',
            password='password123'
        )
        self.category = Category.objects.create(
            title='Tech News',
            created_by=self.user
        )

        # Create various posts
        self.post1 = Post.objects.create(
            content='Python is amazing',
            created_by=self.user,
            audience='PUBLIC'
        )
        self.post2 = Post.objects.create(
            content='Django framework tutorials',
            created_by=self.user,
            category=self.category,
            audience='PUBLIC'
        )
        self.post3 = Post.objects.create(
            content='Random thought about coffee',
            created_by=self.user,
            audience='PUBLIC'
        )

    def test_search_by_content(self):
        """Test searching posts by content keyword"""
        response = self.client.get(reverse('search_posts'), {'q': 'Python'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 1)
        self.assertEqual(response.data['results'][0]['id'], self.post1.id)

    def test_search_by_category(self):
        """Test searching posts by category title"""
        response = self.client.get(reverse('search_posts'), {'q': 'Tech'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        # Should find post2 which belongs to 'Tech News' category
        self.assertEqual(len(response.data['results']), 1)
        self.assertEqual(response.data['results'][0]['id'], self.post2.id)

    def test_search_missing_query(self):
        """Test search without query parameter"""
        response = self.client.get(reverse('search_posts'))
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

    def test_search_case_insensitive(self):
        """Test case insensitive search"""
        response = self.client.get(reverse('search_posts'), {'q': 'PYTHON'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 1)

    def test_search_no_results(self):
        """Test search with no matching results"""
        response = self.client.get(reverse('search_posts'), {'q': 'NonExistentTerm'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 0)
