uri-register 0.3.0

A high-performance PostgreSQL-backed URI dictionary service for assigning unique integer IDs to URIs
Documentation
o

�1'i��@s�dZddlZddlmmZddlZddlZe�	d�ddl
mZejdd��Z
ejjdd��Zejjd	d
��Zejjdd��Zejjd
d��Zejjdd��Zejjdd��Zejjdd��ZdS)z�
Tests for Python bindings of uri-register

Prerequisites:
- PostgreSQL running locally
- Database initialized with schema.sql
- DATABASE_URL environment variable set

Run with: pytest tests/test_python_bindings.py
�N�uri_register)�UriRegisterc�s*�tj�dd�}t�|ddd�IdH}|S)z)Create a UriRegister instance for testingZDATABASE_URLzpostgres://localhost/accessr�i'N)�os�environ�getr�new)Zdb_url�reg�r
�G/Users/ianbailey/Development/uri-register/tests/test_python_bindings.py�registers�
�rc�s��d}|�|�IdH}t|t�}|sUddt��vst�t�r#t�t�nddt��vs/t�|�r4t�|�nddt��vs@t�t�rEt�t�ndt�|�d�}tt�	|���d}d}||k}|s�t�
d	|fd
||f�dt��vstt�|�ryt�|�ndt�|�d�}dd
|i}tt�	|���d}}|�|�IdH}	||	k}|s�t�
d|fd||	f�dt��vs�t�|�r�t�|�nddt��vs�t�|	�r�t�|	�ndd�}
dd|
i}tt�	|���d}dS)zTest registering a single URIzhttp://example.org/test/singleN�5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}�
isinstance�id1�int��py0�py1�py2�py4r��>�z%(py0)s > %(py3)s�r�py3�assert %(py5)s�py5��==)z%(py0)s == %(py2)s�id2)rrzassert %(py4)sr)�register_urirr�@py_builtins�locals�
@pytest_ar�_should_repr_global_name�	_saferepr�AssertionError�_format_explanation�_call_reprcompare)r�urir�@py_assert3�@py_format5�@py_assert2�@py_assert1�@py_format4�@py_format6r�@py_format3r
r
r�test_register_single_uri%s��x�r1c	�sz�gd�}|�|�IdH}t|t�}|sWddt��vs t�t�r%t�t�nddt��vs1t�|�r6t�|�nddt��vsBt�t�rGt�t�ndt�|�d�}tt�	|���d}t
|�}t
|�}||k}|s�t�d|fd	||f�d
t��vs|t�t
�r�t�t
�nd
dt��vs�t�|�r�t�|�ndt�|�d
t��vs�t�t
�r�t�t
�nd
dt��vs�t�|�r�t�|�ndt�|�d�}d
d|i}	tt�	|	���d}}}|D]�}
t|
t�}|�s&ddt��vs�t�t�r�t�t�nddt��vs�t�|
��rt�|
�nddt��v�st�t��rt�t�ndt�|�d�}tt�	|���d}d}|
|k}|�sct�d|fd|
|f�dt��v�sHt�|
��rMt�|
�ndt�|�d�}dd|i}
tt�	|
���d}}q�t
|�D]N\}}|�|�IdH}||}||k}|�s�t�d|fd||f�t�|�dt��v�s�t�|��r�t�|�ndd�}dd|i}
tt�	|
���d}}�qldS)z/Test batch registration with order preservation)zhttp://example.org/test/batch/1zhttp://example.org/test/batch/2zhttp://example.org/test/batch/3Nr
r�ids�listrr)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}�len�uris)rrrr�py6�py8zassert %(py10)s�py10�idrrrrrrr)z%(py1)s == %(py3)s�
individual_id�rr)�register_uri_batchrr3r!r"r#r$r%r&r'r4r(r�	enumerater )rr5r2r*r+r,�@py_assert7�@py_assert4�@py_format9�@py_format11r9r-r.r/�ir)r:�@py_assert0r
r
r�test_register_uri_batch3s�������rDc�s��gd�}|�|�IdH}t|�}d}||k}|s^t�d|fd||f�dt��vs.t�t�r3t�t�nddt��vs?t�|�rDt�|�ndt�|�t�|�d�}d	d
|i}tt�	|���d}}}|d}|d}	||	k}|s�t�d|fd
||	f�t�|�t�|	�d�}
dd|
i}tt�	|���d}}}	|d}|d}	||	k}|s�t�d|fd||	f�t�|�t�|	�d�}
dd|
i}tt�	|���d}}}	dS)z4Test batch registration handles duplicates correctly)�http://example.org/test/dup/1zhttp://example.org/test/dup/2rEN�r�z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr4r2�rrrr6�assert %(py8)sr7r�)z%(py1)s == %(py4)s�rr�assert %(py6)sr6�)�!=)z%(py1)s != %(py4)s)
r<r4r#r(r!r"r$r%r&r')rr5r2r,�@py_assert5r?�@py_format7r@rCr*r+r
r
r�'test_register_uri_batch_with_duplicatesLs��nrrQc�s��gd�}|�|�IdH}t|t�}|sWddt��vs t�t�r%t�t�nddt��vs1t�|�r6t�|�nddt��vsBt�t�rGt�t�ndt�|�d�}tt�	|���d}t
|�}d}||k}|s�t�d	|fd
||f�dt��vszt�t
�rt�t
�nddt��vs�t�|�r�t�|�ndt�|�t�|�d�}d
d|i}	tt�	|	���d}}}d}
|
|v}|s�t�d|fd|
|f�t�|
�dt��vs�t�|�r�t�|�ndd�}dd|i}tt�	|���d}
}d}
|
|v}|�s't�d|fd|
|f�t�|
�dt��v�st�|��rt�|�ndd�}dd|i}tt�	|���d}
}|��D]�\}
}t|t
�}|�s�ddt��v�sIt�t��rNt�t�nddt��v�s\t�|��rat�|�nddt��v�sot�t
��rtt�t
�ndt�|�d�}tt�	|���d}d}||k}|�s�t�d|fd||f�dt��v�s�t�|��r�t�|�ndt�|�d�}dd|i}tt�	|���d}}�q/dS)z+Test batch registration returning a hashmap)�!http://example.org/test/hashmap/1�!http://example.org/test/hashmap/2rRNr
r�mapping�dictrrJrrGr4rHrIr7rR��in�z%(py1)s in %(py3)sr;rrrSr9rrrrr)�register_uri_batch_hashmaprrUr!r"r#r$r%r&r'r4r(�itemsr)rr5rTr*r+r,rOr?rPr@rCr.r/Z_urir9r-r
r
r�test_register_uri_batch_hashmap^s���x~���r[c�s��|�d�IdH|�d�IdH|��IdH}t|t�}|sbddt��vs+t�t�r0t�t�nddt��vs<t�|�rAt�|�nddt��vsMt�t�rRt�t�ndt�|�d�}t	t�
|���d}d	}||v}|s�t�d
|fd||f�t�|�dt��vs�t�|�r�t�|�ndd�}d
d|i}t	t�
|���d}}d}||v}|s�t�d
|fd||f�t�|�dt��vs�t�|�r�t�|�ndd�}d
d|i}t	t�
|���d}}|d	}t|t�}	|	�s ddt��vs�t�t�r�t�t�ndt�|�dt��v�st�t��rt�t�ndt�|	�d�}t	t�
|���d}}	|d}t|t�}	|	�sjddt��v�s>t�t��rCt�t�ndt�|�dt��v�sUt�t��rZt�t�ndt�|	�d�}t	t�
|���d}}	|d	}d}||k}|�s�t�d|fd||f�t�|�t�|�d�}dd|i}
t	t�
|
���d}}}|d}d}||k}|�s�t�d|fd||f�t�|�t�|�d�}dd|i}
t	t�
|
���d}}}dS)zTest getting statisticszhttp://example.org/test/stats/1Nzhttp://example.org/test/stats/2r
r�statsrUrZ
total_urisrVrXr;rrZ
size_bytesz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r)rrrrrJ)�>=)z%(py1)s >= %(py4)srKrLr6rr)z%(py1)s > %(py4)s)
r r\rrUr!r"r#r$r%r&r'r(r)rr\r*r+rCr,r.r/r-r?rPr
r
r�
test_statsws��xx��lpr^c
	�s��dd�td�D�}|�|�IdH}t|�}d}||k}|sct�d|fd||f�dt��vs3t�t�r8t�t�nddt��vsDt�|�rIt�|�ndt�|�t�|�d	�}d
d|i}t	t�
|���d}}}t|�}t|�}d}	||	k}
|
s�t�d|
fd||	f�dt��vs�t�t�r�t�t�ndd
t��vs�t�t�r�t�t�nd
dt��vs�t�|�r�t�|�ndt�|�t�|�t�|	�d�}dd|i}t	t�
|���d}}}
}	dS)z3Test that batch operations work with larger batchescSsg|]}d|���qS)zhttp://example.org/test/perf/r
)�.0rBr
r
r�
<listcomp>�sz*test_batch_performance.<locals>.<listcomp>�dNrrGr4r2rHrIr7)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)s�set)rrrrr6Zpy9zassert %(py11)sZpy11)�ranger<r4r#r(r!r"r$r%r&r'rb)
rr5r2r,rOr?rPr@r*Z@py_assert8r>Z@py_format10Z@py_format12r
r
r�test_batch_performance�s
���rdc�s�|�g�IdH}g}||k}|sAt�d|fd||f�dt��vs&t�|�r+t�|�ndt�|�d�}dd|i}tt�|���d}}|�	g�IdH}i}||k}|s�t�d|fd||f�dt��vsjt�|�rot�|�ndt�|�d�}dd|i}tt�|���d}}dS)	z&Test batch operations with empty inputNr)z%(py0)s == %(py3)sr2rrrrT)
r<r#r(r!r"r$r%r&r'rY)rr2r,r-r.r/rTr
r
r�test_empty_batch�s
�x|re)�__doc__�builtinsr!�_pytest.assertion.rewrite�	assertion�rewriter#r�pytest�importorskiprr�fixturer�mark�asyncior1rDrQr[r^rdrer
r
r
r�<module>s*"