#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This work was created by participants in the DataONE project, and is
# jointly copyrighted by participating institutions in DataONE. For
# more information on DataONE, see our web site at http://dataone.org.
#
#   Copyright ${year}
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'''Module d1_test_case
======================

Extends unittest.TestCase with DataONE specific asserts.

:Created: 2011-04-27
:Author: DataONE (dahl)
:Dependencies:
  - python 2.6

'''

import datetime
import unittest
import urlparse


class D1TestCase(unittest.TestCase):

  def assert_validate_method_name(self, context, method_name):
    valid_method_names = context.nodes['tier_1_methods']
    valid_method_names.extend(context.nodes['tier_2_methods'])
    valid_method_names.extend(context.nodes['tier_3_methods'])
    valid_method_names.extend(context.nodes['tier_4_methods'])
    valid_method_names.extend(context.nodes['tier_5_methods'])
    valid = False
    for valid_method_name in valid_method_names:
      if method_name == valid_method_name:
        valid = True
        break
    self.assertTrue(valid, 'Invalid method name: {0}'.format(method_name))


  def assert_response_headers(self, response):
    '''Required response headers are present.
    '''
    self.assertIn('Last-Modified', response)
    self.assertIn('Content-Length', response)
    self.assertIn('Content-Type', response)


  def assert_valid_date(self, date_str):
    self.assertTrue(datetime.datetime(*map(int, date_str.split('-'))))


  def B_object_collection_is_empty(self):
    '''Object collection is empty.
    '''
    client = test_client.TestClient(context.node['baseurl'])
    # Get object collection.
    object_list = client.listObjects(context.TOKEN)
    # Check header.
    self.assert_counts(object_list, 0, 0, 0)


def D_object_collection_is_populated(self):
  '''Object collection is populated.
  '''
  client = test_client.TestClient(context.node['baseurl'])
  # Get object collection.
  object_list = client.listObjects(context.TOKEN,
                                   count=d1_common.const.MAX_LISTOBJECTS)
  # Check header.
  self.assert_counts(object_list, 0, OBJECTS_TOTAL_DATA, OBJECTS_TOTAL_DATA)


def D_event_log_is_populated(self):
  '''Event log is populated.
  '''
  client = test_client.TestClient(context.node['baseurl'])
  logRecords = client.getLogRecords(context.TOKEN, datetime.datetime(1800, 1, 1))
  self.assertEqual(len(logRecords.logEntry), EVENTS_TOTAL)
  found = False
  for o in logRecords.logEntry:
    if o.identifier.value() == 'hdl:10255/dryad.654/mets.xml' and o.event == 'create':
      found = True
      break
  self.assertTrue(found)


def xml_validation(self):
  '''Returned XML document validates against the ObjectList schema.
  '''
  client = test_client.TestClient(context.node['baseurl'])
  response = client.listObjectsResponse(context.TOKEN,
                                        count=d1_common.const.MAX_LISTOBJECTS)
  xml_doc = response.read()
  d1_common.util.validate_xml(xml_doc)