class CachingTest(unittest.TestCase):
    def setUp(self):
        from Products.ZSPARQLMethod.Method import ZSPARQLMethod
        self.method = ZSPARQLMethod('sq', "Test Method", SPARQL_URL)

        from Products.StandardCacheManagers.RAMCacheManager import RAMCache
        self.cache = RAMCache()
        self.cache.__dict__.update({
            'threshold': 100,
            'cleanup_interval': 300,
            'request_vars': ()
        })
        self.method.ZCacheable_getCache = Mock(return_value=self.cache)
        self.method.ZCacheable_setManagerId('_cache_for_test')

    def test_invalidate(self):
        self.cache.ZCache_invalidate = Mock()
        self.method.manage_edit(_mock_request())
        self.cache.ZCache_invalidate.assert_called_once_with(self.method)

    @patch('Products.ZSPARQLMethod.Method.query_and_get_result')
    def test_cached_queries(self, mock_query):
        onto_name = EIONET_RDF + '/ontology/name'
        self.method.query = "SELECT * WHERE {$subject <%s> ?value}" % onto_name
        self.method.arg_spec = u"subject:iri"
        mock_query.return_value = {
            'rows': [],
            'var_names': [],
            'has_result': True
        }

        self.method(subject=EIONET_RDF + '/languages/en')
        self.method(subject=EIONET_RDF + '/languages/da')
        self.method(subject=EIONET_RDF + '/languages/da')
        self.method(subject=EIONET_RDF + '/languages/en')
        self.method(subject=EIONET_RDF + '/languages/fr')
        self.method(subject=EIONET_RDF + '/languages/fr')
        self.method(subject=EIONET_RDF + '/languages/fr')
        self.method(subject=EIONET_RDF + '/languages/fr')
        self.method(subject=EIONET_RDF + '/languages/da')

        self.assertEqual(len(mock_query.call_args_list), 3)