add tests
add middleware