@@ -27,6 +27,122 @@ def test_list_submissions(db: Session, client: TestClient, logged_in_user):
27
27
assert response .json ()["results" ][0 ]["id" ] == str (submission .id )
28
28
29
29
30
+ def test_obtain_submission_lock (db : Session , client : TestClient , logged_in_user ):
31
+ submission = fakes .MetadataSubmissionFactory (
32
+ author = logged_in_user , author_orcid = logged_in_user .orcid
33
+ )
34
+ fakes .SubmissionRoleFactory (
35
+ submission = submission ,
36
+ submission_id = submission .id ,
37
+ user_orcid = logged_in_user .orcid ,
38
+ role = SubmissionEditorRole .owner ,
39
+ )
40
+ db .commit ()
41
+
42
+ # Should be able to successfully GET this submission and the lock should not be set
43
+ response = client .request (method = "get" , url = f"/api/metadata_submission/{ submission .id } " )
44
+ assert response .status_code == 200
45
+ body = response .json ()
46
+ assert body .get ("locked_by" ) is None
47
+
48
+ # Attempt to acquire the lock
49
+ response = client .request (method = "put" , url = f"/api/metadata_submission/{ submission .id } /lock" )
50
+ assert response .status_code == 200
51
+ body = response .json ()
52
+ assert body ["success" ] is True
53
+ assert body ["locked_by" ]["id" ] == str (logged_in_user .id )
54
+
55
+ # Verify that the lock is set
56
+ response = client .request (method = "get" , url = f"/api/metadata_submission/{ submission .id } " )
57
+ assert response .status_code == 200
58
+ body = response .json ()
59
+ assert body ["locked_by" ]["id" ] == str (logged_in_user .id )
60
+
61
+
62
+ def test_cannot_acquire_lock_on_locked_submission (db : Session , client : TestClient , logged_in_user ):
63
+ locking_user = fakes .UserFactory ()
64
+ submission = fakes .MetadataSubmissionFactory (
65
+ author = logged_in_user ,
66
+ author_orcid = logged_in_user .orcid ,
67
+ locked_by = locking_user ,
68
+ lock_updated = datetime .utcnow (),
69
+ )
70
+ fakes .SubmissionRoleFactory (
71
+ submission = submission ,
72
+ submission_id = submission .id ,
73
+ user_orcid = logged_in_user .orcid ,
74
+ role = SubmissionEditorRole .owner ,
75
+ )
76
+ db .commit ()
77
+
78
+ # Attempt to acquire the lock, verify that it fails and reports the current lock holder
79
+ response = client .request (method = "put" , url = f"/api/metadata_submission/{ submission .id } /lock" )
80
+ assert response .status_code == 409
81
+ body = response .json ()
82
+ assert body ["success" ] is False
83
+ assert body ["locked_by" ]["id" ] == str (locking_user .id )
84
+
85
+
86
+ def test_release_submission_lock (db : Session , client : TestClient , logged_in_user ):
87
+ submission = fakes .MetadataSubmissionFactory (
88
+ author = logged_in_user ,
89
+ author_orcid = logged_in_user .orcid ,
90
+ locked_by = logged_in_user ,
91
+ lock_updated = datetime .utcnow (),
92
+ )
93
+ fakes .SubmissionRoleFactory (
94
+ submission = submission ,
95
+ submission_id = submission .id ,
96
+ user_orcid = logged_in_user .orcid ,
97
+ role = SubmissionEditorRole .owner ,
98
+ )
99
+ db .commit ()
100
+
101
+ # Verify that the lock is set
102
+ response = client .request (method = "get" , url = f"/api/metadata_submission/{ submission .id } " )
103
+ assert response .status_code == 200
104
+ body = response .json ()
105
+ assert body ["locked_by" ]["id" ] == str (logged_in_user .id )
106
+
107
+ # Release the lock
108
+ response = client .request (method = "put" , url = f"/api/metadata_submission/{ submission .id } /unlock" )
109
+ assert response .status_code == 200
110
+ body = response .json ()
111
+ assert body ["success" ] is True
112
+
113
+ # Verify that the lock is released
114
+ response = client .request (method = "get" , url = f"/api/metadata_submission/{ submission .id } " )
115
+ assert response .status_code == 200
116
+ body = response .json ()
117
+ assert body ["locked_by" ] is None
118
+
119
+
120
+ def test_cannot_release_other_users_submission_lock (
121
+ db : Session , client : TestClient , logged_in_user
122
+ ):
123
+ locking_user = fakes .UserFactory ()
124
+ submission = fakes .MetadataSubmissionFactory (
125
+ author = logged_in_user ,
126
+ author_orcid = logged_in_user .orcid ,
127
+ locked_by = locking_user ,
128
+ lock_updated = datetime .utcnow (),
129
+ )
130
+ fakes .SubmissionRoleFactory (
131
+ submission = submission ,
132
+ submission_id = submission .id ,
133
+ user_orcid = logged_in_user .orcid ,
134
+ role = SubmissionEditorRole .owner ,
135
+ )
136
+ db .commit ()
137
+
138
+ # Attempt to release the lock, verify that it fails
139
+ response = client .request (method = "put" , url = f"/api/metadata_submission/{ submission .id } /unlock" )
140
+ assert response .status_code == 409
141
+ body = response .json ()
142
+ assert body ["success" ] is False
143
+ assert body ["locked_by" ]["id" ] == str (locking_user .id )
144
+
145
+
30
146
def test_try_edit_locked_submission (db : Session , client : TestClient , logged_in_user ):
31
147
# Locked by a random user at utcnow by default
32
148
submission = fakes .MetadataSubmissionFactory (
0 commit comments