def provider(self, provider):
     if provider is None:
         provider = ShortyService.get_default_provider_name()
     else:
         provider, provider_names = provider.lower(
         ), ShortyService.get_provider_names()
         if provider not in provider_names:
             raise ValidationException(
                 'invalid_provider_name',
                 f"'provider' expected to be one of {', '.join(provider_names)!r}"
             )
     self.__provider = provider
def test_provider_chain_depth_equals_to_number_of_available_providers():
    # GIVEN method parameters
    # WHEN
    chain = ShortyService().get_provider_chain()
    depth = 1
    while True:
        chain = chain._next_provider
        if chain is not None:
            depth += 1
        else:
            break
    # THEN
    assert depth == len(ShortyService.get_provider_names())
def test_first_provider_in_chain_is_the_one_requested(provider_names, selected_provider_name):
    # GIVEN selected_provider_name
    service = ShortyService()
    defaut_provider_name = provider_names[0]

    if selected_provider_name is not None:
        expected_provider_type = service.provider_map[selected_provider_name]
    else:
        expected_provider_type = service.provider_map[defaut_provider_name]
        service.get_default_provider_name = MagicMock(return_value=defaut_provider_name)
    # WHEN
    actual_provider_type = type(service.get_provider_chain(selected_provider_name))
    # THEN
    assert expected_provider_type == actual_provider_type
    if selected_provider_name is None:
        service.get_default_provider_name.assert_called_once()
def test_provider_chain_when_all_providers_fail(mock_fail_response):
    # GIVEN
    provider_it = iter(ShortyService.provider_map.values())
    tinyurl_provider, bitly_provider, bitly_clone_provider = next(provider_it), next(provider_it), next(provider_it)
    valid_url = 'https://example.com'
    expected_ex_code = "no_available_provider"
    expected_ex_message = "Something went wrong on our side, please try again later"
    expected_ex_status = HTTPStatus.SERVICE_UNAVAILABLE

    # Mock TinyUrlProvider's Response, and assign it to its post_data method
    tinyurl_provider.post_data = Mock(return_value = mock_fail_response)

    # Mock BitlyProvider's Response, and assign it to its post_data method
    bitly_provider.post_data = Mock(return_value = mock_fail_response)

    # Mock BitlyCloneProvider's Response, and assign it to its post_data method
    bitly_clone_provider.post_data = Mock(return_value = mock_fail_response)
    # WHEN
    with pytest.raises(ProviderException) as ex_info:
        ShortyService().get_provider_chain().get_shortlink(valid_url)
    ex = ex_info.value

    assert ex.code == expected_ex_code
    assert ex.message == expected_ex_message
    assert ex.status == expected_ex_status

    # THEN
    tinyurl_provider.post_data.assert_called_once()
    bitly_provider.post_data.assert_called_once()
    bitly_clone_provider.post_data.assert_called_once()
def test_provider_chain_when_first_and_second_provider_fails(mock_fail_response):
    # GIVEN
    provider_it = iter(ShortyService.provider_map.values())
    tinyurl_provider, bitly_provider, bitly_clone_provider = next(provider_it), next(provider_it), next(provider_it)
    valid_url = 'https://example.com'

    # Mock TinyUrlProvider's Response, and assign it to its post_data method
    tinyurl_provider.post_data = Mock(return_value = mock_fail_response)

    # Mock BitlyProvider's Response, and assign it to its post_data method
    bitly_provider.post_data = Mock(return_value = mock_fail_response)

    # Mock BitlyCloneProvider's Response, and assign it to its post_data method
    mock_bitly_clone_post_resp = Mock()
    mock_bitly_clone_post_resp.status_code = 200
    mock_bitly_clone_post_resp.json = Mock(return_value = {'link': 'https://bit.ly/example'})
    bitly_clone_provider.post_data = Mock(return_value = mock_bitly_clone_post_resp)

    # WHEN
    ShortyService().get_provider_chain().get_shortlink(valid_url)

    # THEN
    tinyurl_provider.post_data.assert_called_once()
    bitly_provider.post_data.assert_called_once()
    bitly_clone_provider.post_data.assert_called_once()
def test_shorty_request_for_valid_input(url, provider):
    # GIVEN method parameters
    # WHEN
    shorty_request = ShortyRequest(url, provider)
    # THEN
    assert shorty_request.url == url
    if provider is None:
        assert shorty_request.provider == ShortyService.get_default_provider_name(
        )
    else:
        assert shorty_request.provider == provider
示例#7
0
def create_shortlink():
    try:
        request_data = request.get_json()
        if request_data is None: raise Exception
    except Exception:
        raise SystemException(HTTPStatus.BAD_REQUEST, 'invalid_body')

    data = ShortyRequest(request_data.get('url'), request_data.get('provider'))
    link = ShortyService().get_provider_chain(data.provider).get_shortlink(
        data.url)

    return jsonify({'url': data.url, 'link': link}), HTTPStatus.OK
def test_provider_chain_when_selected_provider_is_invalid():
    # GIVEN
    selected_provider_name = 'invalid_provider_name_value'
    expected_ex_code = 'invalid_provider_name'
    expected_ex_message = f"'provider' expected to be one of {', '.join(ShortyService.get_provider_names())!r}"
    expected_ex_status = HTTPStatus.UNPROCESSABLE_ENTITY
    try:
        ShortyService().get_provider_chain(selected_provider_name)
    except ValidationException as ex:
        # THEN
        assert ex.code == expected_ex_code
        assert ex.message == expected_ex_message
        assert ex.status == expected_ex_status
def test_provider_chain_when_first_provider_works():
    # GIVEN
    provider_it = iter(ShortyService.provider_map.values())
    tinyurl_provider, bitly_provider, bitly_clone_provider = next(provider_it), next(provider_it), next(provider_it)
    valid_url = 'https://example.com'

    # Mock BitlyProvider's Response, and assign it to its post_data method
    mock_tinyurl_post_resp = Mock()
    mock_tinyurl_post_resp.status_code = 200
    tinyurl_provider.post_data = Mock(return_value = mock_tinyurl_post_resp)

    bitly_provider.post_data = Mock()
    bitly_clone_provider.post_data = Mock()

    # WHEN
    ShortyService().get_provider_chain().get_shortlink(valid_url)

    # THEN
    tinyurl_provider.post_data.assert_called_once()
    bitly_provider.post_data.assert_not_called()
    bitly_clone_provider.post_data.assert_not_called()
def test_get_default_provider_name(provider_names):
    assert ShortyService.get_default_provider_name() == provider_names[0]
def test_get_provider_names(provider_names):
    assert ShortyService.get_provider_names() == provider_names