
    iL                     *   d Z ddlZddlmc mZ ddlmZmZ ddl	m
Z
 ddlZddlmZmZmZ ddlmZ dd	ed
edefdZej        de
defd            Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          ZdS )zTests for SQLite storage layer.    N)UTCdatetime)Path)NoveltyScenarioTypeUseCaseDatabaseabc123def456https://example.com/1idurlreturnc                     t          j        t                    }t          di d| ddddd|dd	d
dd|d|dt          j        dddgdddddddddt          j        dg ddS )N)tzr   titlezTest Use CasesummaryzA test summary.
source_urlsource_platform
hackernewsauthortestuserpublished_atcollected_atscenario_type
tools_usedClaudePythonhas_local_dataFhas_workflow_optTvalue_scoreg      ?is_real_valuenoveltysimilar_to_idsraw_contentzraw text )r   nowr   r   r   CODE_GEN_REVIEWr   NEW)r   r   r'   s      9/root/projects/ai_usecases_explorer/tests/test_storage.py_make_usecaser+      s    
,#


C   2o "! 3	
 % z S S #22 h'' u  D d   r!" J#     tmp_pathc                 (    t          | dz            S )z0Create a fresh in-memory Database for each test.test.dbdb_pathr	   )r-   s    r*   dbr2   "   s     Hy01111r,   c                   .    e Zd ZdeddfdZdeddfdZdS )TestDatabaseInitr-   r   Nc                 t   |dz  }t          |           |j        } |            }|sddt          j                    v st	          j        |          rt	          j        |          ndt	          j        |          t	          j        |          dz  }t          t	          j        |                    d x}}d S )Nzmydb.dbr0   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}db_filepy0py2py4)	r
   exists@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)selfr-   r6   @py_assert1@py_assert3@py_format5s         r*   test_creates_db_filez%TestDatabaseInit.test_creates_db_file)   s    Y&!!!!~~~ww~r,   c                 r   t          |dz            }d }||u}|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j        |                    d x}}d S )	Nr/   r0   )is not)z%(py0)s is not %(py3)sr2   r8   py3assert %(py5)spy5)	r
   r>   _call_reprcomparer<   r=   r?   r@   rA   rB   )rC   r-   r2   @py_assert2rD   @py_format4@py_format6s          r*   test_accepts_path_objectz)TestDatabaseInit.test_accepts_path_object.   s    h2333r~rrrr,   )__name__
__module____qualname__r   rG   rR   r&   r,   r*   r4   r4   (   sX         T  d        
 $      r,   r4   c                   N    e Zd ZdeddfdZdeddfdZdeddfdZdeddfdZdS )TestDatabaseSaver2   r   Nc                    t                      }|                    |          }|j        }||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          nddt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j
        |                    d x}}d S )N==)z*%(py0)s == %(py4)s
{%(py4)s = %(py2)s.id
}resultucr7   zassert %(py6)spy6)r+   saver   r>   rN   r<   r=   r?   r@   rA   rB   )rC   r2   r\   r[   rE   rD   rF   @py_format7s           r*   test_save_returns_usecase_idz-TestDatabaseSave.test_save_returns_usecase_id4   s   __vvvvr,   c                 F   t                      }|                    |           |j        }|j        } ||          }|sddt	          j                    v st          j        |          rt          j        |          ndt          j        |          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }t          t          j
        |                    d x}x}}d S )N`assert %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.exists
}(%(py5)s
{%(py5)s = %(py3)s.id
})
}r2   r\   r8   r9   rK   rM   py7r+   r^   r;   r   r<   r=   r>   r?   r@   rA   rB   )rC   r2   r\   rD   @py_assert4@py_assert6@py_format8s          r*   test_save_persists_recordz*TestDatabaseSave.test_save_persists_record9   s   __
yyyrryr,   c                 v    t                      }|                    |           |                    |           d S )N)r+   r^   )rC   r2   r\   s      r*   "test_save_duplicate_does_not_raisez3TestDatabaseSave.test_save_duplicate_does_not_raise>   s-    __

r,   c                    t          dd          }t          dd          }|                    |           |                    |           |j        }|j        } ||          }|sddt	          j                    v st          j        |          rt          j        |          ndt          j        |          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }t          t          j
        |                    d x}x}}|j        }|j        } ||          }|sddt	          j                    v st          j        |          rt          j        |          ndt          j        |          d	t	          j                    v st          j        |          rt          j        |          nd	t          j        |          t          j        |          dz  }t          t          j
        |                    d x}x}}d S )
Naaa111bbb222r   ccc333ddd444https://example.com/2rb   r2   uc1rc   uc2re   )rC   r2   rp   rq   rD   rf   rg   rh   s           r*   test_save_multiple_recordsz+TestDatabaseSave.test_save_multiple_recordsC   sD   N,CDDN,CDD

y  yy               r     r      y                                                y  yy               r     r      y                                                  r,   )rS   rT   rU   r
   r`   ri   rk   rr   r&   r,   r*   rW   rW   3   s        x D    
 H          
X $    
!X !$ ! ! ! ! ! !r,   rW   c                   .    e Zd ZdeddfdZdeddfdZdS )TestDatabaseExistsr2   r   Nc                    |j         }d} ||          }d}||u }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}}d S )	Nnonexistent123Fis)zL%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.exists
}(%(py4)s)
} is %(py9)sr2   )r8   r9   r:   r]   py9zassert %(py11)spy11)	r;   r>   rN   r<   r=   r?   r@   rA   rB   )	rC   r2   rD   rE   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s	            r*    test_exists_false_for_unknown_idz3TestDatabaseExists.test_exists_false_for_unknown_idM   s'   y3)3yy)**3e3*e3333333333*e333333333333r33333r333333y3333)3333*3333e333333333333333333333333333333333r,   c           	         t                      }|                    |           |j        }|j        } ||          }d}||u }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}x}}d S )	NTrw   )ze%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.exists
}(%(py5)s
{%(py5)s = %(py3)s.id
})
} is %(py10)sr2   r\   )r8   r9   rK   rM   rd   py10zassert %(py12)spy12)r+   r^   r;   r   r>   rN   r<   r=   r?   r@   rA   rB   )
rC   r2   r\   rD   rf   rg   @py_assert9r|   @py_format11@py_format13s
             r*   test_exists_true_after_savez.TestDatabaseExists.test_exists_true_after_saveP   sx   __
y''yy'4'4''''''''''4''''''''''''r'''''r''''''y''''''''''''''''''''''''''''''4'''''''''''''''''''''''''''''''''r,   )rS   rT   rU   r
   r   r   r&   r,   r*   rt   rt   L   sX        48 4 4 4 4 4(h (4 ( ( ( ( ( (r,   rt   c                   ^    e Zd ZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdS )	TestDatabaseGetByScenarior2   r   Nc                    |                     t          j                  }g }||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j
        |                    d x}}d S NrY   )z%(py0)s == %(py3)sresultsrJ   rL   rM   )get_by_scenarior   r(   r>   rN   r<   r=   r?   r@   rA   rB   )rC   r2   r   rO   rD   rP   rQ   s          r*   'test_returns_empty_list_when_no_recordszATestDatabaseGetByScenario.test_returns_empty_list_when_no_recordsW   s    $$\%ABBw"}w"ww"r,   c                 r   t                      }|                    |           |                    t          j                  }t          |          }d}||k    }|st          j        d|fd||f          dt          j	                    v st          j
        t
                    rt          j        t
                    nddt          j	                    v st          j
        |          rt          j        |          ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d	         }	|	j        }|j        }
||
k    }|st          j        d|fd
||
f          t          j        |	          t          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |
          dz  }dd|iz  }t          t          j        |                    d x}	x}x}}
d S )N   rY   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   r8   py1rK   r]   assert %(py8)spy8r   )zB%(py3)s
{%(py3)s = %(py1)s.id
} == %(py7)s
{%(py7)s = %(py5)s.id
}r\   )r   rK   rM   rd   zassert %(py9)sry   )r+   r^   r   r   r(   r   r>   rN   r<   r=   r?   r@   rA   rB   r   )rC   r2   r\   r   rO   r{   rf   r_   @py_format9@py_assert0rg   rh   r~   s                r*   test_returns_matching_recordsz7TestDatabaseGetByScenario.test_returns_matching_records[   sM   __
$$\%ABB7|| q |q          |q            s     s             7     7      |    q                           qz%z}%%}%%%%%%%%%%}%%%%%z%%%%}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r,   c                    t                      }|                    |           |                    t          j                  }g }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dz  }dd|iz  }t          t          j        |                    d x}}d S r   )r+   r^   r   r   WORKFLOW_AUTOMATIONr>   rN   r<   r=   r?   r@   rA   rB   )rC   r2   r\   r   rO   rD   rP   rQ   s           r*   #test_does_not_return_other_scenarioz=TestDatabaseGetByScenario.test_does_not_return_other_scenariob   s    __
$$\%EFFw"}w"ww"r,   c                    t          dd          }t          dd          }|                    |           |                    |           |                    t          j                  }t          |          }d}||k    }|st          j        d|fd||f          dt          j	                    v st          j
        t
                    rt          j        t
                    ndd	t          j	                    v st          j
        |          rt          j        |          nd	t          j        |          t          j        |          d
z  }dd|iz  }	t          t          j        |	                    d x}x}}d S )Nrm   r   rn   ro      rY   r   r   r   r   r   r   )r+   r^   r   r   r(   r   r>   rN   r<   r=   r?   r@   rA   rB   
rC   r2   rp   rq   r   rO   r{   rf   r_   r   s
             r*   &test_returns_multiple_matching_recordsz@TestDatabaseGetByScenario.test_returns_multiple_matching_recordsh   sw   N,CDDN,CDD

$$\%ABB7|| q |q          |q            s     s             7     7      |    q                             r,   c                    t          d          D ].}t          d|dd|           }|                    |           /|                    t          j        d          }t          |          }d}||k    }|st          j        d|fd||f          d	t          j
                    v st          j        t                    rt          j        t                    nd	d
t          j
                    v st          j        |          rt          j        |          nd
t          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}d S )N   r   010dzhttps://example.com/r   limitrY   r   r   r   r   r   r   )ranger+   r^   r   r   r(   r   r>   rN   r<   r=   r?   r@   rA   rB   )
rC   r2   ir\   r   rO   r{   rf   r_   r   s
             r*   test_limits_resultsz-TestDatabaseGetByScenario.test_limits_resultsp   s   q 	 	A}A}}}.HQ.H.HIIBGGBKKKK$$\%A$KK7|| q |q          |q            s     s             7     7      |    q                             r,   )	rS   rT   rU   r
   r   r   r   r   r   r&   r,   r*   r   r   V   s        ( t    & &T & & & &h 4    ! !d ! ! ! !!h !4 ! ! ! ! ! !r,   r   c                   .    e Zd ZdeddfdZdeddfdZdS )TestDatabaseGetRecentr2   r   Nc                    t          dd          }t          dd          }|                    |           |                    |           |                    d          }t          |          }d}||k    }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}}d S )Nrm   r   rn   ro   
   r   r   rY   r   r   r   r   r   r   )r+   r^   
get_recentr   r>   rN   r<   r=   r?   r@   rA   rB   r   s
             r*   )test_get_recent_returns_last_n_real_valuez?TestDatabaseGetRecent.test_get_recent_returns_last_n_real_valuey   st   N,CDDN,CDD

--b-))7|| q |q          |q            s     s             7     7      |    q                             r,   c                 
   t                      }|                    |           |                    t          j                  }|d         }|j        }|j        }||k    }|st          j        d|fd||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|j        }|j        }||k    }|st          j        d|fd	||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|j        }|j        }||k    }|st          j        d|fd
||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|j        }|j        }||k    }|st          j        d|fd||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|j        }|j        }||k    }|st          j        d|fd||f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}d S )Nr   rY   )zH%(py2)s
{%(py2)s = %(py0)s.title
} == %(py6)s
{%(py6)s = %(py4)s.title
}loadedr\   )r8   r9   r:   r]   r   r   )zR%(py2)s
{%(py2)s = %(py0)s.tools_used
} == %(py6)s
{%(py6)s = %(py4)s.tools_used
})zT%(py2)s
{%(py2)s = %(py0)s.value_score
} == %(py6)s
{%(py6)s = %(py4)s.value_score
})zL%(py2)s
{%(py2)s = %(py0)s.novelty
} == %(py6)s
{%(py6)s = %(py4)s.novelty
})zZ%(py2)s
{%(py2)s = %(py0)s.similar_to_ids
} == %(py6)s
{%(py6)s = %(py4)s.similar_to_ids
})r+   r^   r   r   r(   r   r>   rN   r<   r=   r?   r@   rA   rB   r   r!   r#   r$   )
rC   r2   r\   r   r   rD   r{   rE   r_   r   s
             r*   test_roundtrip_preserves_fieldsz5TestDatabaseGetRecent.test_roundtrip_preserves_fields   s   __
$$\%ABB|'rx'|x''''''''''|x''''''''''''v'''''v''''''|'''''''''''r'''''r''''''x''''''''''''''''''''''''''' 1BM1 M1111111111 M111111111111v11111v111111 11111111111B11111B111111M111111111111111111111111111!3R^3!^3333333333!^333333333333v33333v333333!33333333333R33333R333333^333333333333333333333333333~++~++++++++++~++++++++++++v+++++v++++++~+++++++++++++++++++++++++++++++++++++++++++++++++$9(99$(99999999999$(9999999999999v99999v999999$9999999999999999999999(999999999999999999999999999999r,   )rS   rT   rU   r
   r   r   r&   r,   r*   r   r   x   sX        !H ! ! ! ! !	:( 	:t 	: 	: 	: 	: 	: 	:r,   r   )r   r   )__doc__builtinsr<   _pytest.assertion.rewrite	assertionrewriter>   r   r   pathlibr   pytest#ai_usecases_explorer.models.usecaser   r   r   %ai_usecases_explorer.storage.databaser
   strr+   fixturer2   r4   rW   rt   r   r   r&   r,   r*   <module>r      s   % %               " " " " " " " "        N N N N N N N N N N : : : : : : c  SZ    . 2 2( 2 2 2 2
       ! ! ! ! ! ! ! !2( ( ( ( ( ( ( (! ! ! ! ! ! ! !D: : : : : : : : : :r,   