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

User = get_user_model()


class LikeTestCase(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.user = User.objects.create_user(
            username='testuser',
            email='test@example.com',
            password='testpass123'
        )
        self.user2 = User.objects.create_user(
            username='user2',
            email='user2@example.com',
            password='user2pass123'
        )
        from posts.models import Post
        self.post = Post.objects.create(
            content='Test post',
            created_by=self.user
        )
        from comments.models import Comment
        self.comment = Comment.objects.create(
            post=self.post,
            created_by=self.user2,
            content='Test comment'
        )

    def test_list_post_likes(self):
        """Test listing likes for a post"""
        from likes.models import LikePost
        LikePost.objects.create(user=self.user2, post=self.post)
        self.client.force_authenticate(user=self.user)
        response = self.client.get(reverse('list_post_likes', args=[self.post.id]))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_list_comment_likes(self):
        """Test listing likes for a comment"""
        from likes.models import LikeComment
        LikeComment.objects.create(user=self.user, comment=self.comment)
        self.client.force_authenticate(user=self.user)
        response = self.client.get(reverse('list_comment_likes', args=[self.comment.id]))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_like_post_unique_constraint(self):
        """Test that a user can only like a post once"""
        from likes.models import LikePost
        # First like should succeed
        LikePost.objects.create(user=self.user2, post=self.post)
        # Second like should raise IntegrityError
        with self.assertRaises(Exception):
            LikePost.objects.create(user=self.user2, post=self.post)

    def test_like_comment_unique_constraint(self):
        """Test that a user can only like a comment once"""
        from likes.models import LikeComment
        # First like should succeed
        LikeComment.objects.create(user=self.user, comment=self.comment)
        # Second like should raise IntegrityError
        with self.assertRaises(Exception):
            LikeComment.objects.create(user=self.user, comment=self.comment)