Pyzotero: a Python client for the Zotero API pyzotero.readthedocs.io
zotero

Add more tests

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