import json
import pytest

from buildtrigger.test.bitbucketmock import get_bitbucket_trigger
from buildtrigger.triggerutil import (SkipRequestException, ValidationRequestException,
                                      InvalidPayloadException)
from endpoints.building import PreparedBuild
from util.morecollections import AttrDict

@pytest.fixture
def bitbucket_trigger():
  return get_bitbucket_trigger()


def test_list_build_subdirs(bitbucket_trigger):
  assert bitbucket_trigger.list_build_subdirs() == ["/Dockerfile"]


@pytest.mark.parametrize('dockerfile_path, contents', [
  ('/Dockerfile', 'hello world'),
  ('somesubdir/Dockerfile', 'hi universe'),
  ('unknownpath', None),
])
def test_load_dockerfile_contents(dockerfile_path, contents):
  trigger = get_bitbucket_trigger(dockerfile_path)
  assert trigger.load_dockerfile_contents() == contents


@pytest.mark.parametrize('payload, expected_error, expected_message', [
  ('{}', InvalidPayloadException, "'push' is a required property"),

  # Valid payload:
  ('''{
    "push": {
        "changes": [{
            "new": {
                "name": "somechange",
                "target": {
                    "hash": "aaaaaaa",
                    "message": "foo",
                    "date": "now",
                    "links": {
                        "html": {
                            "href": "somelink"
                        }
                    }
                }
            }
        }]
    },
    "repository": {
        "full_name": "foo/bar"
    }
   }''', None, None),

  # Skip message:
  ('''{
    "push": {
        "changes": [{
            "new": {
                "name": "somechange",
                "target": {
                    "hash": "aaaaaaa",
                    "message": "[skip build] foo",
                    "date": "now",
                    "links": {
                        "html": {
                            "href": "somelink"
                        }
                    }
                }
            }
        }]
    },
    "repository": {
        "full_name": "foo/bar"
    }
   }''', SkipRequestException, ''),
])
def test_handle_trigger_request(bitbucket_trigger, payload, expected_error, expected_message):
  def get_payload():
    return json.loads(payload)

  request = AttrDict(dict(get_json=get_payload))

  if expected_error is not None:
    with pytest.raises(expected_error) as ipe:
      bitbucket_trigger.handle_trigger_request(request)
    assert ipe.value.message == expected_message
  else:
    assert isinstance(bitbucket_trigger.handle_trigger_request(request), PreparedBuild)