import pytest
import sys

import CommonServerPython
import demistomock as demisto

LOC_VALID = ['41.40338,2.17403', '41.40338,2.17403 ', ' 41.40338 ,   2.17403    ', '32.0868197,34.7810571',
             '41.40338:2.17403']


@pytest.mark.parametrize('loc', LOC_VALID)
def test_valid_loc(loc, mocker):
    """
    Given:
    - Valid coordinate str of lat and lng.

    When:
    - Parsing them into lat and lng separately.

    Then:
    - Ensure parsing is done as expected.

    """
    mocker.patch.object(demisto, 'args', return_value={'indicator': {'CustomFields': {'geolocation': loc}}})
    return_results_mock = mocker.patch.object(demisto, 'results')
    # This will trigger the script
    if 'ShowLocationOnMap' in sys.modules:
        del (sys.modules['ShowLocationOnMap'])
    import ShowLocationOnMap  # noqa: F401
    splitter = ',' if ',' in loc else ':'
    lat, lng = loc.split(splitter)
    expected_lat = float(lat)
    expected_lng = float(lng)
    results = return_results_mock.call_args[0][0]
    assert results['Contents']['lat'] == expected_lat
    assert results['Contents']['lng'] == expected_lng


INVALID_LOC = ['unknown,unknown2', '123saas4as', '41.40338,41.40338,41.40338', '']


def return_error_called():
    raise Exception('return_error_called')


@pytest.mark.parametrize('loc', INVALID_LOC)
def test_invalid_loc(loc, mocker):
    """
    Given:
    - Invalid coordinate str of lat and lng.

    When:
    - Parsing them into lat and lng separately.

    Then:
    - Ensure return error is called.

    """
    mocker.patch.object(demisto, 'args', return_value={'indicator': {'CustomFields': {'geolocation': loc}}})
    mocker.patch.object(CommonServerPython, 'return_error', side_effect=return_error_called)
    # This will trigger the script
    if 'ShowLocationOnMap' in sys.modules:
        del (sys.modules['ShowLocationOnMap'])
    with pytest.raises(Exception, match='return_error_called'):
        import ShowLocationOnMap  # noqa: F401

import pytest
import sys

import CommonServerPython
import demistomock as demisto

LOC_VALID = ['41.40338,2.17403', '41.40338,2.17403 ', ' 41.40338 ,   2.17403    ', '32.0868197,34.7810571',
             '41.40338:2.17403']


@pytest.mark.parametrize('loc', LOC_VALID)
def test_valid_loc(loc, mocker):
    """
    Given:
    - Valid coordinate str of lat and lng.

    When:
    - Parsing them into lat and lng separately.

    Then:
    - Ensure parsing is done as expected.

    """
    mocker.patch.object(demisto, 'args', return_value={'indicator': {'CustomFields': {'geolocation': loc}}})
    return_results_mock = mocker.patch.object(demisto, 'results')
    # This will trigger the script
    if 'ShowLocationOnMap' in sys.modules:
        del (sys.modules['ShowLocationOnMap'])
    import ShowLocationOnMap  # noqa: F401
    splitter = ',' if ',' in loc else ':'
    lat, lng = loc.split(splitter)
    expected_lat = float(lat)
    expected_lng = float(lng)
    results = return_results_mock.call_args[0][0]
    assert results['Contents']['lat'] == expected_lat
    assert results['Contents']['lng'] == expected_lng


INVALID_LOC = ['unknown,unknown2', '123saas4as', '41.40338,41.40338,41.40338', '']


def return_error_called():
    raise Exception('return_error_called')


@pytest.mark.parametrize('loc', INVALID_LOC)
def test_invalid_loc(loc, mocker):
    """
    Given:
    - Invalid coordinate str of lat and lng.

    When:
    - Parsing them into lat and lng separately.

    Then:
    - Ensure return error is called.

    """
    mocker.patch.object(demisto, 'args', return_value={'indicator': {'CustomFields': {'geolocation': loc}}})
    mocker.patch.object(CommonServerPython, 'return_error', side_effect=return_error_called)
    # This will trigger the script
    if 'ShowLocationOnMap' in sys.modules:
        del (sys.modules['ShowLocationOnMap'])
    with pytest.raises(Exception, match='return_error_called'):
        import ShowLocationOnMap  # noqa: F401

Given:     - Valid coordinate str of lat and lng.      When:     - Parsing them into lat and lng separately.      Then:     - Ensure parsing is done as expected. # This will trigger the script # noqa: F401 Given:     - Invalid coordinate str of lat and lng.      When:     - Parsing them into lat and lng separately.      Then:     - Ensure return error is called. # This will trigger the script # noqa: F401