import shutil
from datetime import datetime, timezone
from pathlib import Path

from twisted.trial import unittest

from scrapy.exceptions import NotConfigured
from scrapy.extensions.spiderstate import SpiderState
from scrapy.spiders import Spider
from scrapy.utils.test import get_crawler


class SpiderStateTest(unittest.TestCase):
    def test_store_load(self):
        jobdir = self.mktemp()
        Path(jobdir).mkdir()
        try:
            spider = Spider(name="default")
            dt = datetime.now(tz=timezone.utc)

            ss = SpiderState(jobdir)
            ss.spider_opened(spider)
            spider.state["one"] = 1
            spider.state["dt"] = dt
            ss.spider_closed(spider)

            spider2 = Spider(name="default")
            ss2 = SpiderState(jobdir)
            ss2.spider_opened(spider2)
            self.assertEqual(spider.state, {"one": 1, "dt": dt})
            ss2.spider_closed(spider2)
        finally:
            shutil.rmtree(jobdir)

    def test_state_attribute(self):
        # state attribute must be present if jobdir is not set, to provide a
        # consistent interface
        spider = Spider(name="default")
        ss = SpiderState()
        ss.spider_opened(spider)
        self.assertEqual(spider.state, {})
        ss.spider_closed(spider)

    def test_not_configured(self):
        crawler = get_crawler(Spider)
        self.assertRaises(NotConfigured, SpiderState.from_crawler, crawler)
