import unittest
from core.rwl.guard.prd_checker import PRDChecker

class TestPRDChecker(unittest.TestCase):

    def setUp(self):
        self.checker = PRDChecker()

    def test_validate_prd_valid_dict(self):
        prd = {
            'title': 'Example PRD',
            'description': 'This is an example PRD.',
            'user_stories': [
                'As a user, I want to be able to do X so that I can achieve Y.',
                'As a user, I want to be able to do A so that I can achieve B.'
            ]
        }
        self.assertTrue(self.checker.validate_prd(prd))

    def test_validate_prd_valid_string(self):
        prd = "This is a PRD. User story: As a user, I want to..."
        self.assertTrue(self.checker.validate_prd(prd))

    def test_validate_prd_invalid_empty_dict(self):
        prd = {}
        self.assertFalse(self.checker.validate_prd(prd))

    def test_validate_prd_invalid_no_user_stories(self):
        prd = {
            'title': 'Example PRD',
            'description': 'This is an example PRD.'
        }
        self.assertFalse(self.checker.validate_prd(prd))

    def test_validate_prd_invalid_empty_string(self):
        prd = ""
        self.assertFalse(self.checker.validate_prd(prd))

    def test_check_task_prd_valid(self):
        task = {
            'name': 'Task 1',
            'prd': {
                'title': 'Example PRD',
                'description': 'This is an example PRD.',
                'user_stories': [
                    'As a user, I want to be able to do X so that I can achieve Y.',
                    'As a user, I want to be able to do A so that I can achieve B.'
                ]
            }
        }
        self.assertTrue(self.checker.check_task_prd(task))

    def test_check_task_prd_invalid_no_prd(self):
        task = {
            'name': 'Task 2'
        }
        self.assertFalse(self.checker.check_task_prd(task))

    def test_check_task_prd_invalid_empty_prd(self):
        task = {
            'name': 'Task 3',
            'prd': {}
        }
        self.assertFalse(self.checker.check_task_prd(task))

    def test_check_task_prd_valid_string(self):
        task = {
            'name': 'Task 4',
            'prd': 'User Story: As a user, I want to...' 
        }
        self.assertTrue(self.checker.check_task_prd(task))


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