async def test_selectcomp_view_existing(storage_dir, activity_testbed) -> None: # GIVEN details_screen = activity_testbed.mock( "compman.ui.compdetails.CompetitionDetailsScreen") storage.save_competition(storage.StoredCompetition("one", title="One")) storage.save_competition(storage.StoredCompetition("two", title="Two")) # WHEN async with activity_testbed.shown(SelectCompetitionScreen) as act: content = activity_testbed.render() assert "One" in content assert "Two" in content focus = activity_testbed.get_focus_widgets()[-1] assert focus.get_label() == "One" await activity_testbed.keypress("enter") # THEN selected = act.response.result() assert selected.id == "one" settings = storage.get_settings() assert settings.current_competition_id == "one"
async def test_soaringspot_existing(storage_dir: str, soaringspot: SoaringSpotFixture, activity_testbed: ActivityTestbed) -> None: # GIVEN storage.save_competition(storage.StoredCompetition(id="one", title="One")) soaringspot.competitions = [ SoaringSpotContest( id="one", href="http://soaringspot.local/one", title="One", description="First contest", ), SoaringSpotContest( id="two", href="http://soaringspot.local/two", title="Two", description="Second contest", ), ] # WHEN async with activity_testbed.shown(SoaringSpotPickerScreen): await activity_testbed.gather_tasks() focused = activity_testbed.get_focus_widgets()[-1] assert focused.get_label() == "One" assert "First contest" in activity_testbed.render() await activity_testbed.keypress("enter") # THEN res = await activity_testbed.response() assert isinstance(res, storage.StoredCompetition) assert res.id == "one" assert res.title == "One" assert res.soaringspot_url == "http://soaringspot.local/one"
def _on_waypoint_changed(self, ev, new_state, selected): if not new_state: return self.competition.waypoints = selected storage.save_competition(self.competition) self._udpate_xcsoar_config(self.competition) self.status.flash(f"Waypoint changed to: {selected}")
def _on_airspace_changed(self, ev, new_state, selected): if not new_state: return self.competition.airspace = selected storage.save_competition(self.competition) self._udpate_xcsoar_config(self.competition) self.status.flash(f"Airspace changed to: {selected}")
async def test_mainmenu_details(storage_dir, activity_testbed) -> None: # GIVEN welcome_screen = activity_testbed.mock("compman.ui.welcome.WelcomeScreen") details_screen = activity_testbed.mock( "compman.ui.compdetails.CompetitionDetailsScreen") async with activity_testbed.shown(MainMenuScreen): # WHEN await asyncio.sleep(0) assert welcome_screen.shown comp = storage.StoredCompetition("test", "Test competition") storage.save_competition(comp) settings = storage.get_settings() settings.current_competition_id = comp.id await activity_testbed.keypress("esc") contents = activity_testbed.render() assert "Current Competition" in contents focused = activity_testbed.get_focus_widgets()[-1] assert focused.get_label() == "Current Competition" await activity_testbed.keypress("enter") # THEN assert details_screen.shown
def _on_class_selected(self, ev, new_state, new_class): if new_state: self._comp.selected_class = new_class storage.save_competition(self._comp) self._emit("change", new_class) wdg = self._create_class_display() self.container.original_widget = wdg
def _setup_test_comp() -> storage.StoredCompetition: comp = storage.StoredCompetition( id="test", title="Test Competition", soaringspot_url="https://soaringspot.local/test", ) storage.save_competition(comp, set_current=True) return comp
def sample_competition(storage_dir): comp = storage.StoredCompetition("test", "Test competition") storage.save_competition(comp) settings = storage.get_settings() settings.current_competition_id = comp.id storage.save_settings() try: yield comp finally: settings.current_competition_id = None storage.save_settings() storage.delete_competition(comp.id)
def test_get_waypoint_files(storage_dir) -> None: # GIVEN comp = storage.StoredCompetition(id="first", title="First Competition") storage.save_competition(comp) # WHEN storage.store_file("first", "waypoint.cup", io.BytesIO(b"test")) files = storage.get_waypoint_files("first") assert [f.name for f in files] == ["waypoint.cup"] files = storage.get_airspace_files("first") assert files == []
def _on_competition_selected( self, btn: urwid.Widget, sscomp: soaringspot.SoaringSpotContest) -> None: comp = storage.load_competition(sscomp.id) if comp is not None: comp.title = sscomp.title comp.soaringspot_url = sscomp.href else: comp = storage.StoredCompetition(id=sscomp.id, title=sscomp.title, soaringspot_url=sscomp.href) storage.save_competition(comp) self._emit("select", comp)
def test_save_competition(storage_dir) -> None: # GIVEN comp = storage.StoredCompetition( id="first", title="First Competition", soaringspot_url="http://localhost", airspace="airspace.txt", waypoints="waypoints.txt", ) # WHEN storage.save_competition(comp) # THEN comps = storage.list_competitions() assert [c.id for c in comps] == ["first"]
def test_load_competition_existing(storage_dir) -> None: # GIVEN comp = storage.StoredCompetition( id="first", title="First Competition", soaringspot_url="http://localhost", airspace="airspace.txt", waypoints=None, ) storage.save_competition(comp) # WHEN loaded = storage.load_competition("first") assert loaded is not None # THEN assert loaded.id == "first" assert loaded.title == "First Competition" assert loaded.soaringspot_url == "http://localhost" assert loaded.airspace == "airspace.txt" assert loaded.waypoints == None
async def _update_classes(self) -> None: if self._comp.soaringspot_url is None: return self.status.set_text(("progress", "Fetching competition classes...")) try: classes = await soaringspot.fetch_classes(self._comp.soaringspot_url) except soaringspot.SoaringSpotClientError as e: self.status.set_text( ("error message", f"Error fetching competition classes: {e}") ) log.exception("Error fetching competition classes") return self._comp.classes = classes storage.save_competition(self._comp) self._populate_class_radios() if classes: self.status.set_text("Pick your competition class:") else: self.status.set_text( ("remark", "No classes available for this competition") )
def _on_profile_changed(self, ev, selected, profile: str) -> None: if selected: self.competition.add_profile(profile) else: self.competition.remove_profile(profile) storage.save_competition(self.competition)