# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from __future__ import absolute_import, print_function

import json
from pathlib2 import Path

import mozunit
import pytest

from mozilla_version.gecko import GeckoVersion
from mozrelease.buglist_creator import (
    is_excluded_change, create_bugs_url, is_backout_bug, get_previous_tag_version,
    get_bugs_in_changeset, tag_version, parse_tag_version,
)


DATA_PATH = Path(__file__).with_name("data")


def test_beta_1_release():
    buglist_str_54_0b1 = create_bugs_url(
        product='firefox',
        current_version=GeckoVersion.parse('54.0b1'),
        current_revision='cf76e00dcd6f',
    )
    assert buglist_str_54_0b1 == '', 'There should be no bugs to compare for beta 1.'


@pytest.mark.parametrize('description,is_excluded', (
    ('something something something a=test-only something something something', True),
    ('this is a a=release change!', True),
))
def test_is_excluded_change(description, is_excluded):
    assert is_excluded_change({'desc': description}) == is_excluded


@pytest.mark.parametrize('description,is_backout', (
    ('I backed out this bug because', True),
    ('Backing out this bug due to', True),
    ('Backout bug xyz', True),
    ('Back out bug xyz', True),
    ('this is a regular bug description', False),
))
def test_is_backout_bug(description, is_backout):
    assert is_backout_bug(description) == is_backout


@pytest.mark.parametrize('product,version,tag', (
    ('firefox', GeckoVersion.parse('53.0b10'), 'FIREFOX_53_0b10_RELEASE'),
    ('firefox', GeckoVersion.parse('52.0'), 'FIREFOX_52_0_RELEASE'),
    ('fennec', GeckoVersion.parse('52.0.2'), 'FENNEC_52_0_2_RELEASE'),
))
def test_tag_version(product, version, tag):
    assert tag_version(product, version) == tag


@pytest.mark.parametrize('tag,version', (
    ('FIREFOX_53_0b10_RELEASE', GeckoVersion.parse('53.0b10')),
    ('FIREFOX_52_0_RELEASE', GeckoVersion.parse('52.0')),
    ('FENNEC_52_0_2_RELEASE', GeckoVersion.parse('52.0.2')),
))
def test_parse_tag_version(tag, version):
    assert parse_tag_version(tag) == version


@pytest.mark.parametrize('version,tag,previous_tag', (
    (GeckoVersion.parse('48.0b4'), 'FIREFOX_48_0b4_RELEASE', 'FIREFOX_48_0b3_RELEASE'),
    (GeckoVersion.parse('48.0b9'), 'FIREFOX_48_0b9_RELEASE', 'FIREFOX_48_0b7_RELEASE'),
    (GeckoVersion.parse('48.0.2'), 'FIREFOX_48_0_2_RELEASE', 'FIREFOX_48_0_1_RELEASE'),
    (GeckoVersion.parse('48.0.1'), 'FIREFOX_48_0_1_RELEASE', 'FIREFOX_48_0_RELEASE'),
))
def test_get_previous_tag_version(version, tag, previous_tag):
    product = 'firefox'
    ff_48_tags = [
        u'FIREFOX_BETA_48_END',
        u'FIREFOX_RELEASE_48_END',
        u'FIREFOX_48_0_2_RELEASE',
        u'FIREFOX_48_0_2_BUILD1',
        u'FIREFOX_48_0_1_RELEASE',
        u'FIREFOX_48_0_1_BUILD3',
        u'FIREFOX_48_0_RELEASE',
        u'FIREFOX_48_0_BUILD2',
        u'FIREFOX_RELEASE_48_BASE',
        u'FIREFOX_48_0b10_RELEASE',
        u'FIREFOX_48_0b10_BUILD1',
        u'FIREFOX_48_0b9_RELEASE',
        u'FIREFOX_48_0b9_BUILD1',
        u'FIREFOX_48_0b7_RELEASE',
        u'FIREFOX_48_0b7_BUILD1',
        u'FIREFOX_48_0b6_RELEASE',
        u'FIREFOX_48_0b6_BUILD1',
        u'FIREFOX_48_0b5_RELEASE',
        u'FIREFOX_48_0b5_BUILD1',
        u'FIREFOX_48_0b4_RELEASE',
        u'FIREFOX_48_0b4_BUILD1',
        u'FIREFOX_48_0b3_RELEASE',
        u'FIREFOX_48_0b3_BUILD1',
        u'FIREFOX_48_0b2_RELEASE',
        u'FIREFOX_48_0b2_BUILD2',
        u'FIREFOX_48_0b1_RELEASE',
        u'FIREFOX_48_0b1_BUILD2',
        u'FIREFOX_AURORA_48_END',
        u'FIREFOX_BETA_48_BASE',
        u'FIREFOX_AURORA_48_BASE',
    ]

    mock_hg_json = {
        'tags': [
            {'tag': ff_48_tag} for ff_48_tag in ff_48_tags
        ],
    }

    assert get_previous_tag_version(product, version, tag, mock_hg_json) == previous_tag


def test_get_bugs_in_changeset():
    with DATA_PATH.joinpath("buglist_changesets.json").open("r") as fp:
        changeset_data = json.load(fp)
    bugs, backouts = get_bugs_in_changeset(changeset_data)

    assert bugs == {u'1356563', u'1348409', u'1341190', u'1360626', u'1332731', u'1328762',
                    u'1355870', u'1358089', u'1354911', u'1354038'}
    assert backouts == {u'1337861', u'1320072'}


if __name__ == '__main__':
    mozunit.main()
