# -*- coding: utf-8 -*-
from uuid import uuid4
from openprocurement.api.tests.base import BaseWebTest
from mock import Mock, MagicMock
from couchdb import Server as CouchdbServer
from copy import copy

REPLICATION = {
    "pid": "<0.17282.20>",
    "checkpoint_interval": 5000,
    "checkpointed_source_seq": 0,
    "continuous": True,
    "doc_id": "de1a666d189db087bcd6151d2c0014a2",
    "doc_write_failures": 0,
    "docs_read": 231078,
    "docs_written": 231078,
    "missing_revisions_found": 231076,
    "progress": 100,
    "replication_id":"c54108a5a3c6f23208936eb961611021+continuous+create_target",
    "revisions_checked": 1000,
    "source":"http://op_db_reader:*****@source/openprocurement/",
    "source_seq": 1000,
    "started_on": 1476261621,
    "target": "http://target:*****@target/openprocurement/",
    "type": "replication",
    "updated_on":1476366001
}

REPLICATION_OK = copy(REPLICATION)
REPLICATION_OK['checkpointed_source_seq'] = REPLICATION_OK['source_seq']


class HealthTestBase(BaseWebTest):

    return_value = []

    def setUp(self):
        self.db_name += uuid4().hex
        # self.couchdb_server.create(self.db_name)
        couchdb_server = Mock(spec=CouchdbServer)
        couchdb_server.tasks = MagicMock(return_value=self.return_value)
        self.app.app.registry.couchdb_server = couchdb_server
        self.db_name = self.db.name
        self.app.authorization = ('Basic', ('token', ''))

    def test_health_view(self):
        response = self.app.get('/health', status=503)
        self.assertEqual(response.status, '503 Service Unavailable')

        response = self.app.get('/health?health_threshold_func=all', status=503)
        self.assertEqual(response.status, '503 Service Unavailable')

        response = self.app.get('/health?health_threshold_func=any', status=503)
        self.assertEqual(response.status, '503 Service Unavailable')

class HealthTest503(HealthTestBase):
    return_value = [REPLICATION]

    def test_health_view(self):
        response = self.app.get('/health?health_threshold=10000', status=200)
        self.assertEqual(response.status, '200 OK')

class HealthTest200(HealthTestBase):
    return_value = [REPLICATION_OK]


    def test_health_view(self):
        response = self.app.get('/health', status=200)
        self.assertEqual(response.status, '200 OK')

        response = self.app.get('/health?health_threshold_func=all', status=200)
        self.assertEqual(response.status, '200 OK')

        response = self.app.get('/health?health_threshold_func=any', status=200)
        self.assertEqual(response.status, '200 OK')


class HealthTest_all(HealthTestBase):
    return_value = [REPLICATION_OK, REPLICATION_OK]


    def test_health_view(self):
        response = self.app.get('/health', status=200)
        self.assertEqual(response.status, '200 OK')

        response = self.app.get('/health?health_threshold_func=all', status=200)
        self.assertEqual(response.status, '200 OK')


class HealthTest_any(HealthTestBase):
    return_value = [REPLICATION_OK, REPLICATION]


    def test_health_view(self):
        response = self.app.get('/health?health_threshold_func=any', status=200)
        self.assertEqual(response.status, '200 OK')