tangled
alpha
login
or
join now
urschrei.eurosky.social
/
pyzotero
0
fork
atom
Pyzotero: a Python client for the Zotero API
pyzotero.readthedocs.io
zotero
0
fork
atom
overview
issues
pulls
pipelines
Add more tests
urschrei.eurosky.social
1 year ago
a18874de
029b47b0
+117
1 changed file
expand all
collapse all
unified
split
tests
test_zotero.py
+117
tests/test_zotero.py
···
5
5
"""
6
6
# ruff: noqa: N802
7
7
8
8
+
import json
8
9
import os
9
10
import time
10
11
import unittest
12
12
+
from unittest.mock import patch
11
13
12
14
import httpretty
13
15
from dateutil import parser
···
741
743
)
742
744
zot.items()
743
745
self.assertTrue(zot.backoff)
746
746
+
747
747
+
@httpretty.activate
748
748
+
def testDeleteTags(self):
749
749
+
"""Tests deleting tags"""
750
750
+
zot = z.Zotero("myuserID", "user", "myuserkey")
751
751
+
752
752
+
# Mock the initial request to get version info
753
753
+
HTTPretty.register_uri(
754
754
+
HTTPretty.GET,
755
755
+
"https://api.zotero.org/users/myuserID/tags?limit=1",
756
756
+
content_type="application/json",
757
757
+
body=self.tags_doc,
758
758
+
adding_headers={"last-modified-version": "42"},
759
759
+
)
760
760
+
761
761
+
# Mock the delete endpoint
762
762
+
HTTPretty.register_uri(
763
763
+
HTTPretty.DELETE, "https://api.zotero.org/users/myuserID/tags", status=204
764
764
+
)
765
765
+
766
766
+
# Test tag deletion
767
767
+
resp = zot.delete_tags("tag1", "tag2")
768
768
+
769
769
+
# Verify the request
770
770
+
request = httpretty.last_request()
771
771
+
self.assertEqual(request.method, "DELETE")
772
772
+
self.assertEqual(request.headers["If-Unmodified-Since-Version"], "42")
773
773
+
self.assertTrue(resp)
774
774
+
775
775
+
@httpretty.activate
776
776
+
def testAddToCollection(self):
777
777
+
"""Tests adding an item to a collection"""
778
778
+
zot = z.Zotero("myuserID", "user", "myuserkey")
779
779
+
780
780
+
# Mock the PATCH endpoint for adding to collection
781
781
+
HTTPretty.register_uri(
782
782
+
HTTPretty.PATCH,
783
783
+
"https://api.zotero.org/users/myuserID/items/ITEMKEY",
784
784
+
status=204,
785
785
+
)
786
786
+
787
787
+
# Create a test item
788
788
+
item = {"key": "ITEMKEY", "version": 5, "data": {"collections": []}}
789
789
+
790
790
+
# Test adding to collection
791
791
+
resp = zot.addto_collection("COLLECTIONKEY", item)
792
792
+
793
793
+
# Verify the request
794
794
+
request = httpretty.last_request()
795
795
+
self.assertEqual(request.method, "PATCH")
796
796
+
self.assertEqual(request.headers["If-Unmodified-Since-Version"], "5")
797
797
+
798
798
+
# Check the body contains the collection key
799
799
+
800
800
+
body = json.loads(request.body.decode("utf-8"))
801
801
+
self.assertEqual(body["collections"], ["COLLECTIONKEY"])
802
802
+
803
803
+
self.assertTrue(resp)
804
804
+
805
805
+
@httpretty.activate
806
806
+
def testDeleteItem(self):
807
807
+
"""Tests deleting an item"""
808
808
+
zot = z.Zotero("myuserID", "user", "myuserkey")
809
809
+
810
810
+
# Mock the DELETE endpoint
811
811
+
HTTPretty.register_uri(
812
812
+
HTTPretty.DELETE,
813
813
+
"https://api.zotero.org/users/myuserID/items/ITEMKEY",
814
814
+
status=204,
815
815
+
)
816
816
+
817
817
+
# Create a test item
818
818
+
item = {"key": "ITEMKEY", "version": 7}
819
819
+
820
820
+
# Test deletion
821
821
+
resp = zot.delete_item(item)
822
822
+
823
823
+
# Verify the request
824
824
+
request = httpretty.last_request()
825
825
+
self.assertEqual(request.method, "DELETE")
826
826
+
self.assertEqual(request.headers["If-Unmodified-Since-Version"], "7")
827
827
+
828
828
+
self.assertTrue(resp)
829
829
+
830
830
+
@httpretty.activate
831
831
+
def testDeleteMultipleItems(self):
832
832
+
"""Tests deleting multiple items at once"""
833
833
+
zot = z.Zotero("myuserID", "user", "myuserkey")
834
834
+
835
835
+
# Mock the DELETE endpoint for multiple items
836
836
+
HTTPretty.register_uri(
837
837
+
HTTPretty.DELETE, "https://api.zotero.org/users/myuserID/items", status=204
838
838
+
)
839
839
+
840
840
+
# Create test items
841
841
+
items = [{"key": "ITEM1", "version": 5}, {"key": "ITEM2", "version": 3}]
842
842
+
843
843
+
# Test deletion
844
844
+
resp = zot.delete_item(items)
845
845
+
846
846
+
# Verify the request
847
847
+
request = httpretty.last_request()
848
848
+
self.assertEqual(request.method, "DELETE")
849
849
+
self.assertEqual(request.headers["If-Unmodified-Since-Version"], "5")
850
850
+
851
851
+
# Extract and parse the query string
852
852
+
from urllib.parse import parse_qs, urlparse
853
853
+
854
854
+
parsed_url = urlparse(request.url)
855
855
+
query_params = parse_qs(parsed_url.query)
856
856
+
857
857
+
self.assertIn("itemKey", query_params)
858
858
+
self.assertEqual(query_params["itemKey"][0], "ITEM1,ITEM2")
859
859
+
860
860
+
self.assertTrue(resp)
744
861
745
862
def tearDown(self):
746
863
"""Tear stuff down"""