11import pytest
2- from nucleus import Slice , NucleusClient
2+ from nucleus import Slice , NucleusClient , DatasetItem , BoxAnnotation
3+ from nucleus .constants import ERROR_PAYLOAD
4+ from helpers import (
5+ TEST_DATASET_NAME ,
6+ TEST_IMG_URLS ,
7+ TEST_SLICE_NAME ,
8+ TEST_BOX_ANNOTATIONS ,
9+ reference_id_from_url ,
10+ )
11+
12+
13+ @pytest .fixture ()
14+ def dataset (CLIENT ):
15+ ds = CLIENT .create_dataset (TEST_DATASET_NAME )
16+ yield ds
17+
18+ response = CLIENT .delete_dataset (ds .id )
19+ assert response == {}
320
421
522def test_reprs ():
@@ -9,3 +26,118 @@ def test_repr(test_object: any):
926
1027 client = NucleusClient (api_key = "fake_key" )
1128 test_repr (Slice (slice_id = "fake_slice_id" , client = client ))
29+
30+
31+ def test_slice_create_and_delete_and_list (dataset ):
32+ # Dataset upload
33+ ds_items = []
34+ for url in TEST_IMG_URLS :
35+ ds_items .append (
36+ DatasetItem (
37+ image_location = url ,
38+ reference_id = reference_id_from_url (url ),
39+ )
40+ )
41+ response = dataset .append (ds_items )
42+ assert ERROR_PAYLOAD not in response .json ()
43+
44+ # Slice creation
45+ slc = dataset .create_slice (
46+ name = TEST_SLICE_NAME ,
47+ reference_ids = [item .reference_id for item in ds_items [:2 ]],
48+ )
49+
50+ dataset_slices = dataset .slices
51+ assert len (dataset_slices ) == 1
52+ assert slc .slice_id == dataset_slices [0 ]
53+
54+ response = slc .info ()
55+ assert response ["name" ] == TEST_SLICE_NAME
56+ assert response ["dataset_id" ] == dataset .id
57+ assert len (response ["dataset_items" ]) == 2
58+ for item in ds_items [:2 ]:
59+ assert (
60+ item .reference_id == response ["dataset_items" ][0 ]["ref_id" ]
61+ or item .reference_id == response ["dataset_items" ][1 ]["ref_id" ]
62+ )
63+
64+
65+ def test_slice_create_and_annotate (dataset ):
66+ # Dataset upload
67+ url = TEST_IMG_URLS [0 ]
68+ annotation_in_slice = BoxAnnotation (** TEST_BOX_ANNOTATIONS [0 ])
69+ annotation_not_in_slice = BoxAnnotation (** TEST_BOX_ANNOTATIONS [1 ])
70+
71+ ds_items = []
72+ ds_items .append (
73+ DatasetItem (
74+ image_location = url ,
75+ reference_id = reference_id_from_url (url ),
76+ )
77+ )
78+ response = dataset .append (ds_items )
79+ assert ERROR_PAYLOAD not in response .json ()
80+
81+ # Slice creation
82+ slc = dataset .create_slice (
83+ name = TEST_SLICE_NAME ,
84+ reference_ids = [item .reference_id for item in ds_items [:2 ]],
85+ )
86+
87+ slc .annotate (annotations = [annotation_in_slice ])
88+ with pytest .raises (ValueError ) as not_in_slice_error :
89+ slc .annotate (annotations = [annotation_not_in_slice ])
90+
91+ assert (
92+ annotation_not_in_slice .reference_id
93+ in not_in_slice_error .value .args [0 ]
94+ )
95+
96+ slc .annotate (annotations = [annotation_not_in_slice ], strict = False )
97+
98+
99+ def test_slice_append (dataset ):
100+ # Dataset upload
101+ ds_items = []
102+ for url in TEST_IMG_URLS :
103+ ds_items .append (
104+ DatasetItem (
105+ image_location = url ,
106+ reference_id = reference_id_from_url (url ),
107+ )
108+ )
109+ response = dataset .append (ds_items )
110+ assert ERROR_PAYLOAD not in response .json ()
111+
112+ # Slice creation
113+ slc = dataset .create_slice (
114+ name = TEST_SLICE_NAME ,
115+ reference_ids = [ds_items [0 ].reference_id ],
116+ )
117+
118+ # Insert duplicate first item
119+ slc .append (reference_ids = [item .reference_id for item in ds_items [:3 ]])
120+
121+ response = slc .info ()
122+ assert len (response ["dataset_items" ]) == 3
123+ for item in ds_items [:3 ]:
124+ assert (
125+ item .reference_id == response ["dataset_items" ][0 ]["ref_id" ]
126+ or item .reference_id == response ["dataset_items" ][1 ]["ref_id" ]
127+ or item .reference_id == response ["dataset_items" ][2 ]["ref_id" ]
128+ )
129+
130+ all_stored_items = slc .items ()
131+
132+ def sort_by_reference_id (items ):
133+ # Remove the generated item_ids and standardize
134+ # empty metadata so we can do an equality check.
135+ for item in items :
136+ item .item_id = None
137+ if item .metadata == {}:
138+ item .metadata = None
139+ return sorted (items , key = lambda x : x .reference_id )
140+
141+ assert sort_by_reference_id (all_stored_items ) == sort_by_reference_id (
142+ ds_items [:3 ]
143+ )
0 commit comments