"""Unit tests for parallelization in the logic layer.""" import time import pytest from oto import response as oto_response from playlist.api import app from playlist.utils.handler_utils import parallel LONG_REQUEST_KEY = "long" LONG_REQUEST_DURATION = 0.5 LONG_REQUEST_PAYLOAD = {"this": "took", "a": "while"} SHORT_REQUEST_KEY = "short" SHORT_REQUEST_DURATION = 0.2 SHORT_REQUEST_PAYLOAD = {"this": "was", "pretty": "quick"} def long_running_request(isrc, **kwargs): """Run a 'long' request.""" time.sleep(LONG_REQUEST_DURATION) return oto_response.Response(LONG_REQUEST_PAYLOAD) def short_running_request(isrc, **kwargs): """Run a 'short' request.""" time.sleep(SHORT_REQUEST_DURATION) return oto_response.Response(SHORT_REQUEST_PAYLOAD) class TestParallel(object): """Test the parallel method.""" isrc = "DED831000251" def run_parallel(self): """Run the parallel method with some requests.""" with app.test_request_context(): return parallel( { LONG_REQUEST_KEY: { "func": long_running_request, "args": (self.isrc,), "kwargs": {}, }, SHORT_REQUEST_KEY: { "func": short_running_request, "args": (self.isrc,), "kwargs": {}, }, } ) @pytest.fixture def result(self): """Return the result of the parallel method.""" return self.run_parallel() def test_executes_in_parallel(self): """Test that time for methods is shorter than the sum of durations.""" start = time.time() self.run_parallel() end = time.time() assert end - start < (LONG_REQUEST_DURATION + SHORT_REQUEST_DURATION) def test_succeeds(self, result): """Test that the result succeeds.""" assert result.status == 200 def test_contains_result_of_long_request(self, result): """Test that the result contains the response of long request.""" assert result.message[LONG_REQUEST_KEY] == LONG_REQUEST_PAYLOAD def test_contains_result_of_short_request(self, result): """Test that the result contains the response of long request.""" assert result.message[SHORT_REQUEST_KEY] == SHORT_REQUEST_PAYLOAD