# -*- coding: utf-8 -*-
from pathlib import Path

from django.test import TestCase
from eth_tester import EthereumTester
from web3 import HTTPProvider, IPCProvider
from web3.providers.eth_tester import EthereumTesterProvider

from ..exceptions import UnknownBlock
from ..web3_service import Web3Service, Web3ServiceProvider


class TestSingleton(TestCase):

    def setUp(self):
        self.web3_service = Web3Service(provider=EthereumTesterProvider(EthereumTester()))
        self.web3 = self.web3_service.web3
        self.web3.eth.defaultAccount = self.web3.eth.coinbase
        self.provider = self.web3.providers[0]
        self.tx_data = {'from': self.web3.eth.coinbase,
                        'gas': 1000000}
        self.event_receivers = []

    def tearDown(self):
        # Delete centralized oracles
        self.provider.ethereum_tester.reset_to_genesis()
        self.assertEqual(0, self.web3.eth.blockNumber)

        # Delete provider
        try:
            del Web3ServiceProvider.instance
        except AttributeError:
            pass

    def test_unknown_block(self):
        current_block_number = self.web3_service.get_current_block_number()
        self.assertRaises(UnknownBlock, self.web3_service.get_block, current_block_number + 10)

    def test_unknown_blocks(self):
        current_block_number = self.web3_service.get_current_block_number()
        self.assertRaises(UnknownBlock, self.web3_service.get_block, range(current_block_number + 10))

    def test_provider_http(self):
        with self.settings(ETHEREUM_NODE_URL='http://localhost:8545'):
            web3_service = Web3ServiceProvider()
            provider = web3_service.web3.providers[0]
            self.assertTrue(isinstance(provider, HTTPProvider))

        with self.settings(ETHEREUM_NODE_URL='https://localhost:8545'):
            web3_service = Web3ServiceProvider()
            provider = web3_service.web3.providers[0]
            self.assertTrue(isinstance(provider, HTTPProvider))

    def test_provider_ipc(self):
        socket_path = str(Path('/tmp/socket.ipc').expanduser().resolve())
        with self.settings(ETHEREUM_NODE_URL='ipc://' + socket_path):
            web3_service = Web3ServiceProvider()
            provider = web3_service.web3.providers[0]
            self.assertTrue(isinstance(provider, IPCProvider))
            self.assertEqual(provider.ipc_path, socket_path)