mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-07-25 15:03:31 +00:00
115 lines
4.8 KiB
Python
115 lines
4.8 KiB
Python
from django.core.files import File
|
|
from django.test import Client, TestCase
|
|
|
|
from files.models import Category, Media, Tag
|
|
from files.tests import create_account
|
|
|
|
|
|
class TestSearch(TestCase):
|
|
fixtures = ["fixtures/categories.json", "fixtures/encoding_profiles.json"]
|
|
|
|
def setUp(self):
|
|
self.client = Client()
|
|
self.password = 'this_is_a_fake_password'
|
|
self.user = create_account(password=self.password)
|
|
|
|
# Create test media items with different attributes for search testing
|
|
with open('fixtures/test_image2.jpg', "rb") as f:
|
|
myfile = File(f)
|
|
self.media1 = Media.objects.create(title="Python Tutorial", description="Learn Python programming", user=self.user, media_file=myfile)
|
|
|
|
with open('fixtures/test_image2.jpg', "rb") as f:
|
|
myfile = File(f)
|
|
self.media2 = Media.objects.create(
|
|
title="Django Framework",
|
|
description="Web development with Django",
|
|
user=self.user,
|
|
media_file=myfile,
|
|
)
|
|
|
|
with open('fixtures/test_image2.jpg', "rb") as f:
|
|
myfile = File(f)
|
|
self.media3 = Media.objects.create(
|
|
title="JavaScript Basics",
|
|
description="Introduction to JavaScript",
|
|
user=self.user,
|
|
media_file=myfile,
|
|
)
|
|
# Add categories and tags
|
|
self.category = Category.objects.first()
|
|
self.tag = Tag.objects.create(title="programming", user=self.user)
|
|
|
|
self.media1.category.add(self.category)
|
|
self.media2.category.add(self.category)
|
|
self.media1.tags.add(self.tag)
|
|
self.media2.tags.add(self.tag)
|
|
|
|
# Update search vectors
|
|
self.media1.update_search_vector()
|
|
self.media2.update_search_vector()
|
|
self.media3.update_search_vector()
|
|
|
|
def test_search_by_title(self):
|
|
"""Test searching media by title"""
|
|
url = '/api/v1/search?q=python'
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, 200, "Search endpoint should return 200")
|
|
|
|
# Check if our media with "Python" in the title is in the results
|
|
|
|
media_titles = [item['title'] for item in response.data['results']]
|
|
self.assertIn(self.media1.title, media_titles, "Media with 'Python' in title should be in results")
|
|
self.assertNotIn(self.media3.title, media_titles, "Media without 'Python' should not be in results")
|
|
|
|
def test_search_by_category(self):
|
|
"""Test searching media by category"""
|
|
url = f'/api/v1/search?c={self.category.title}'
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, 200, "Category search endpoint should return 200")
|
|
|
|
# Check if media in the category are in the results
|
|
media_titles = [item['title'] for item in response.data['results']]
|
|
self.assertIn(self.media1.title, media_titles, "Media in category should be in results")
|
|
self.assertIn(self.media2.title, media_titles, "Media in category should be in results")
|
|
self.assertNotIn(self.media3.title, media_titles, "Media not in category should not be in results")
|
|
|
|
def test_search_by_tag(self):
|
|
"""Test searching media by tag"""
|
|
url = f'/api/v1/search?t={self.tag.title}'
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, 200, "Tag search endpoint should return 200")
|
|
|
|
# Check if media with the tag are in the results
|
|
media_titles = [item['title'] for item in response.data['results']]
|
|
self.assertIn(self.media1.title, media_titles, "Media with tag should be in results")
|
|
self.assertIn(self.media2.title, media_titles, "Media with tag should be in results")
|
|
self.assertNotIn(self.media3.title, media_titles, "Media without tag should not be in results")
|
|
|
|
def test_search_with_media_type_filter(self):
|
|
"""Test searching with media type filter"""
|
|
url = '/api/v1/search?q=tutorial&media_type=video'
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, 200, "Media type filtered search should return 200")
|
|
|
|
# Create an image media with the same search term
|
|
with open('fixtures/test_image2.jpg', "rb") as f:
|
|
myfile = File(f)
|
|
image_media = Media.objects.create(
|
|
title="Tutorial Image",
|
|
description="Tutorial image description",
|
|
user=self.user,
|
|
media_file=myfile,
|
|
)
|
|
image_media.update_search_vector()
|
|
|
|
# Search with media_type=video
|
|
url = '/api/v1/search?q=tutorial&media_type=video'
|
|
response = self.client.get(url)
|
|
|
|
media_titles = [item['title'] for item in response.data['results']]
|
|
self.assertNotIn(image_media.title, media_titles, "Image media should not be in results")
|