def on_login(self) -> None: """ This function is called once the user has logged into Spotify to obtain the access token. Part of this function is a reimplementation of `tekore.prompt_user_token`. It does the same thing but in a more automatized way, because Qt has access over the web browser too. """ url = self.browser.url logging.info("Now at: %s", url) # If the URL isn't the Spotify response URI (localhost), do nothing if url.find(self.redirect_uri) == -1: return # Trying to get the auth token from the URL with Tekore's # parse_code_from_url(), which throws a KeyError if the URL doesn't # contain an auth token or if it contains more than one. try: code = parse_code_from_url(url) except KeyError as e: logging.info("ERROR: %s", str(e)) return # Now the user token has to be requested to Spotify, while # checking for errors to make sure the credentials were correct. # This will only happen with the client secret because it's only # checked when requesting the user token. try: # A RefreshingToken is used instead of a regular Token so that # it's automatically refreshed before it expires. self.creds is # of type `RefreshingCredentials`, so it returns always a # RefreshingToken. token = self.creds.request_user_token(code) except OAuthError as e: self.browser.hide() self.web_form.show() self.web_form.show_error(str(e)) return # Removing the GUI elements used to obtain the credentials self.layout.removeWidget(self.web_form) self.web_form.hide() self.layout.removeWidget(self.browser) self.browser.hide() # Finally starting the Web API self.done.emit(token)
def test_single_code_returned(self): r = parse_code_from_url('http://example.com?code=1') self.assertEqual(r, '1')
def test_multiple_codes_raises(self): with self.assertRaises(KeyError): parse_code_from_url('http://example.com?code=1&code=2')
def test_no_code_raises(self): with self.assertRaises(KeyError): parse_code_from_url('http://example.com')
def test_empty_url_raises(self): with self.assertRaises(KeyError): parse_code_from_url('')