diff --git a/aircox/tests/conftest.py b/aircox/tests/conftest.py index bb93cca..4cbd7b1 100644 --- a/aircox/tests/conftest.py +++ b/aircox/tests/conftest.py @@ -12,6 +12,26 @@ def stations(): return baker.make(models.Station, _quantity=2) +@pytest.fixture +def stations_without_default(): + return baker.make(models.Station, _quantity=3, default=False) + + +@pytest.fixture +def station_default(): + return baker.make(models.Station, default=True) + + +@pytest.fixture +def stations_inactive(): + return baker.make(models.Station, _quantity=3, active=False) + + +@pytest.fixture +def station_active(): + return baker.make(models.Station, active=True) + + @pytest.fixture def programs(stations): items = list( diff --git a/aircox/tests/models/test_station.py b/aircox/tests/models/test_station.py new file mode 100644 index 0000000..eee4ec6 --- /dev/null +++ b/aircox/tests/models/test_station.py @@ -0,0 +1,232 @@ +import pytest + +from model_bakery import baker + +from aircox.models import Station, Port + +from aircox.conf import settings + + +@pytest.mark.django_db +class TestStationQuerySet: + # default method : not possible to have several stations by default. + # default method : return a selected instance of station but do not save it. + def test_default_without_default_station(self, stations_without_default): + returned_station = Station.objects.default() + + assert returned_station is not None + assert returned_station == Station.objects.first() + + def test_default_with_pkargs_and_without_default_station( + self, stations_without_default + ): + station = stations_without_default[1] + returned_station = Station.objects.default( + station=station.pk + ) + + assert station == returned_station + + def test_default_with_default_station( + self, station_default, stations_without_default + ): + returned_default_station = Station.objects.default() + + assert returned_default_station == station_default + + def test_default_with_pkargs_and_default_station( + self, station_default, stations_without_default + ): + returned_default_station = Station.objects.default( + station=station_default.pk + ) + + assert returned_default_station == station_default + + def test_active(self, station_active, stations_inactive): + filtered_active_station = Station.objects.active() + + assert station_active in filtered_active_station + + +@pytest.mark.django_db +class TestStation: + def test_stream_field_filled(self, stations): + streams_urls = "http://radiocampus.be/stream1.mp3\nhttp://radiocampus.be/stream2.mp3" + station = baker.make(Station, audio_streams=streams_urls) + + assert station.streams == [ + "http://radiocampus.be/stream1.mp3", + "http://radiocampus.be/stream2.mp3", + ] + + def test_stream_field_empty(self, stations): + station = baker.make(Station, audio_streams=None) + + assert station.streams == [] + + def test__str__(self, stations): + for station in stations: + assert station.name == station.__str__() + + def test_save_without_path(self, stations): + station = baker.make(Station, path=None, slug="a-slug-with-dash") + station.save() + + assert ( + station.path + == settings.CONTROLLERS_WORKING_DIR + "\\a_slug_with_dash" + ) + + def test_save_default_station_while_anotherone_is_default( + self, station_default, stations_without_default + ): + old_default_station = station_default + new_default_station = stations_without_default[1] + new_default_station.default = True + new_default_station.save() + old_default_station.refresh_from_db() + new_default_station.refresh_from_db() + + assert Station.objects.filter(default=True).count() == 1 + assert old_default_station.default is False + assert new_default_station.default is True + + +@pytest.mark.django_db +class TestPortQuerySet: + # issues with the preset incompatibility between port and direction. + # I need to control which type and direction for each fake model + # Otherwhise pytest fail randomly. + def test_active_value_true(self): + port1 = baker.make( + Port, + active=True, + type=Port.TYPE_ICECAST, + direction=Port.DIRECTION_OUTPUT, + ) + port2 = baker.make( + Port, + active=False, + type=Port.TYPE_ICECAST, + direction=Port.DIRECTION_OUTPUT, + ) + active_ports = Port.objects.active() + + assert port1 in active_ports + assert port2 not in active_ports + + def test_active_value_false(self): + port1 = baker.make( + Port, + active=True, + type=Port.TYPE_ICECAST, + direction=Port.DIRECTION_OUTPUT, + ) + port2 = baker.make( + Port, + active=False, + type=Port.TYPE_ICECAST, + direction=Port.DIRECTION_OUTPUT, + ) + + inactive_ports = Port.objects.active(value=False) + assert port1 not in inactive_ports + assert port2 in inactive_ports + + def test_output(self): + port1 = baker.make( + Port, type=Port.TYPE_ICECAST, direction=Port.DIRECTION_OUTPUT + ) + port2 = baker.make( + Port, type=Port.TYPE_HTTP, direction=Port.DIRECTION_INPUT + ) + + output_ports = Port.objects.output() + assert port1 in output_ports + assert port2 not in output_ports + + def test_input(self): + port1 = baker.make( + Port, type=Port.TYPE_ICECAST, direction=Port.DIRECTION_OUTPUT + ) + port2 = baker.make( + Port, type=Port.TYPE_HTTP, direction=Port.DIRECTION_INPUT + ) + + input_ports = Port.objects.input() + assert port1 not in input_ports + assert port2 in input_ports + + +@pytest.mark.django_db +class TestPort: + def test__str__(self): + port = baker.make( + Port, type=Port.TYPE_ICECAST, direction=Port.DIRECTION_OUTPUT + ) + assert port.__str__() == "output: icecast #1" + + def test_is_valid_type_and_type_is_input(self): + porthttp = baker.make( + Port, type=Port.TYPE_HTTP, direction=Port.DIRECTION_INPUT + ) + porthttps = baker.make( + Port, type=Port.TYPE_HTTPS, direction=Port.DIRECTION_INPUT + ) + + assert porthttp.is_valid_type() == True + assert porthttps.is_valid_type() == True + + def test_is_valid_type_and_type_is_not_input(self): + porticecast = baker.make( + Port, type=Port.TYPE_ICECAST, direction=Port.DIRECTION_OUTPUT + ) + portfile = baker.make( + Port, type=Port.TYPE_FILE, direction=Port.DIRECTION_OUTPUT + ) + + assert porticecast.is_valid_type() == True + assert portfile.is_valid_type() == True + + def test_save_with_valid_type_icecast_output(self): + port = baker.make( + Port, type=Port.TYPE_ICECAST, direction=Port.DIRECTION_OUTPUT + ) + port.save() + saved_port = Port.objects.get(id=port.id) + + assert saved_port is not None + + def test_save_with_valid_type_file_output(self): + port = baker.make( + Port, type=Port.TYPE_FILE, direction=Port.DIRECTION_OUTPUT + ) + port.save() + saved_port = Port.objects.get(id=port.id) + + assert saved_port is not None + + def test_save_with_valid_type_http_input(self): + port = baker.make( + Port, type=Port.TYPE_HTTP, direction=Port.DIRECTION_INPUT + ) + port.save() + saved_port = Port.objects.get(id=port.id) + + assert saved_port is not None + + def test_save_with_valid_type_https_input(self): + port = baker.make( + Port, type=Port.TYPE_HTTPS, direction=Port.DIRECTION_INPUT + ) + port.save() + saved_port = Port.objects.get(id=port.id) + + assert saved_port is not None + + def test_save_without_valid_type(self): + with pytest.raises(ValueError): + baker.make( + Port, type=Port.TYPE_HTTP, direction=Port.DIRECTION_OUTPUT + )