# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from datetime import datetime
import mock

from google.appengine.api import app_identity

from gae_libs.testcase import TestCase
from model.flake.flake_issue import FlakeIssue


class FlakeIssueTest(TestCase):

  def testCreate(self):
    monorail_project = 'chromium'
    issue_id = 123
    FlakeIssue.Create(
        monorail_project=monorail_project, issue_id=issue_id).put()

    flake_issue = FlakeIssue.Get(monorail_project, issue_id)

    fetched_flake_issues = FlakeIssue.query().fetch()
    self.assertEqual(1, len(fetched_flake_issues))
    self.assertEqual(flake_issue, fetched_flake_issues[0])
    self.assertIsNone(
        fetched_flake_issues[0].last_updated_time_by_flake_detection)
    self.assertEqual(monorail_project, flake_issue.monorail_project)
    self.assertEqual(issue_id, flake_issue.issue_id)
    self.assertIsNone(flake_issue.merge_destination_key)

  def testLuciProjectToMonorailProject(self):
    self.assertEqual('chromium',
                     FlakeIssue.GetMonorailProjectFromLuciProject('chromium'))
    self.assertIsNone(FlakeIssue.GetMonorailProjectFromLuciProject('NA'))

  @mock.patch.object(
      app_identity, 'get_application_id', return_value='findit-for-me-staging')
  def testGetLinkForStagingIssue(self, _):
    monorail_project = 'chromium'
    issue_id = 12345
    self.assertEqual(
        ('https://monorail-staging.appspot.com/p/chromium/issues/detail?'
         'id=12345'), FlakeIssue.GetLinkForIssue(monorail_project, issue_id))

  @mock.patch.object(
      app_identity, 'get_application_id', return_value='findit-for-me')
  def testGetLinkForProdIssue(self, _):
    monorail_project = 'chromium'
    issue_id = 12345
    self.assertEqual(
        'https://monorail-prod.appspot.com/p/chromium/issues/detail?id=12345',
        FlakeIssue.GetLinkForIssue(monorail_project, issue_id))

  def testGetMostUpdatedIssue(self):
    monorail_project = 'chromium'
    issue_id = 12345
    merge_issue_id = 67890

    merge_issue = FlakeIssue.Create(
        monorail_project=monorail_project, issue_id=merge_issue_id)
    merge_issue.put()

    flake_issue = FlakeIssue.Create(
        monorail_project=monorail_project, issue_id=issue_id)
    flake_issue.merge_destination_key = merge_issue.key
    flake_issue.put()

    self.assertEqual(merge_issue, flake_issue.GetMostUpdatedIssue())

  def testGetMostUpdatedIssueNoMerge(self):
    monorail_project = 'chromium'
    issue_id = 12345

    flake_issue = FlakeIssue.Create(
        monorail_project=monorail_project, issue_id=issue_id)
    flake_issue.put()

    self.assertEqual(flake_issue, flake_issue.GetMostUpdatedIssue())

  def testUpdate(self):
    monorail_project = 'chromium'
    issue_id = 12345
    updated_time = datetime(2018, 12, 4, 0, 0, 0)
    status = 'Assigned'
    priority = 1

    flake_issue = FlakeIssue.Create(
        monorail_project=monorail_project, issue_id=issue_id)
    flake_issue.put()

    flake_issue.Update(
        last_updated_time_in_monorail=updated_time,
        status=status,
        priority=priority)
    flake_issue = flake_issue.key.get()

    self.assertEqual(status, flake_issue.status)
    self.assertEqual(priority, flake_issue.priority)
    self.assertEqual(updated_time, flake_issue.last_updated_time_in_monorail)
