1+ """
2+ Tests para Week 1: RAG Fundamentals
3+ NO MODIFIQUES ESTE ARCHIVO
4+ """
5+
6+ import pytest
7+ import numpy as np
8+ from src .main import (
9+ calculate_cosine_similarity ,
10+ find_most_similar ,
11+ retrieve_top_k
12+ )
13+
14+
15+ class TestCosineSimilarity :
16+ """Tests para calculate_cosine_similarity"""
17+
18+ def test_identical_vectors (self ):
19+ """Vectores idénticos deben tener similitud 1.0"""
20+ vec = np .array ([1 , 2 , 3 ])
21+ similarity = calculate_cosine_similarity (vec , vec )
22+ assert np .isclose (similarity , 1.0 ), "Vectores idénticos deben tener similitud 1.0"
23+
24+ def test_orthogonal_vectors (self ):
25+ """Vectores ortogonales deben tener similitud 0.0"""
26+ vec1 = np .array ([1 , 0 , 0 ])
27+ vec2 = np .array ([0 , 1 , 0 ])
28+ similarity = calculate_cosine_similarity (vec1 , vec2 )
29+ assert np .isclose (similarity , 0.0 ), "Vectores ortogonales deben tener similitud 0.0"
30+
31+ def test_opposite_vectors (self ):
32+ """Vectores opuestos deben tener similitud -1.0"""
33+ vec1 = np .array ([1 , 2 , 3 ])
34+ vec2 = np .array ([- 1 , - 2 , - 3 ])
35+ similarity = calculate_cosine_similarity (vec1 , vec2 )
36+ assert np .isclose (similarity , - 1.0 ), "Vectores opuestos deben tener similitud -1.0"
37+
38+ def test_known_similarity (self ):
39+ """Test con similitud conocida"""
40+ vec1 = np .array ([1 , 2 , 3 ])
41+ vec2 = np .array ([4 , 5 , 6 ])
42+ similarity = calculate_cosine_similarity (vec1 , vec2 )
43+ expected = 0.9746318461970762
44+ assert np .isclose (similarity , expected ), f"Esperado { expected } , obtenido { similarity } "
45+
46+
47+ class TestFindMostSimilar :
48+ """Tests para find_most_similar"""
49+
50+ def test_exact_match (self ):
51+ """Debe encontrar el documento idéntico"""
52+ query = np .array ([1 , 0 , 0 ])
53+ docs = [
54+ np .array ([0 , 1 , 0 ]),
55+ np .array ([1 , 0 , 0 ]), # Exacto
56+ np .array ([0 , 0 , 1 ])
57+ ]
58+ result = find_most_similar (query , docs )
59+ assert result == 1 , "Debe encontrar el documento idéntico (índice 1)"
60+
61+ def test_closest_match (self ):
62+ """Debe encontrar el documento más cercano"""
63+ query = np .array ([1 , 0 , 0 ])
64+ docs = [
65+ np .array ([0 , 1 , 0 ]),
66+ np .array ([0.5 , 0.5 , 0 ]),
67+ np .array ([0.9 , 0.1 , 0 ]) # Más cercano
68+ ]
69+ result = find_most_similar (query , docs )
70+ assert result == 2 , "Debe encontrar el documento más cercano (índice 2)"
71+
72+ def test_single_document (self ):
73+ """Con un solo documento, debe retornar índice 0"""
74+ query = np .array ([1 , 2 , 3 ])
75+ docs = [np .array ([4 , 5 , 6 ])]
76+ result = find_most_similar (query , docs )
77+ assert result == 0 , "Con un solo documento debe retornar 0"
78+
79+
80+ class TestRetrieveTopK :
81+ """Tests para retrieve_top_k"""
82+
83+ def test_top_3 (self ):
84+ """Debe retornar los top 3 documentos en orden"""
85+ query = np .array ([1 , 0 , 0 ])
86+ docs = [
87+ np .array ([0 , 1 , 0 ]), # Menos similar
88+ np .array ([1 , 0 , 0 ]), # Más similar (índice 1)
89+ np .array ([0.9 , 0.1 , 0 ]), # 2do más similar (índice 2)
90+ np .array ([0.8 , 0.2 , 0 ]), # 3ro más similar (índice 3)
91+ np .array ([0 , 0 , 1 ]) # Menos similar
92+ ]
93+ result = retrieve_top_k (query , docs , k = 3 )
94+ assert len (result ) == 3 , "Debe retornar exactamente 3 documentos"
95+ assert result [0 ] == 1 , "El más similar debe ser índice 1"
96+ assert result [1 ] == 2 , "El 2do debe ser índice 2"
97+ assert result [2 ] == 3 , "El 3ro debe ser índice 3"
98+
99+ def test_k_larger_than_docs (self ):
100+ """Si k > número de docs, retorna todos los docs"""
101+ query = np .array ([1 , 0 , 0 ])
102+ docs = [
103+ np .array ([1 , 0 , 0 ]),
104+ np .array ([0 , 1 , 0 ])
105+ ]
106+ result = retrieve_top_k (query , docs , k = 5 )
107+ assert len (result ) == 2 , "Debe retornar todos los documentos disponibles"
108+
109+ def test_k_equals_1 (self ):
110+ """Con k=1 debe comportarse como find_most_similar"""
111+ query = np .array ([1 , 0 , 0 ])
112+ docs = [
113+ np .array ([0 , 1 , 0 ]),
114+ np .array ([1 , 0 , 0 ]),
115+ np .array ([0 , 0 , 1 ])
116+ ]
117+ result = retrieve_top_k (query , docs , k = 1 )
118+ assert len (result ) == 1 , "Debe retornar exactamente 1 documento"
119+ assert result [0 ] == 1 , "Debe ser el documento más similar (índice 1)"
120+
121+
122+ if __name__ == "__main__" :
123+ pytest .main ([__file__ , "-v" ])
0 commit comments