diff --git a/radicle/src/cob/patch.rs b/radicle/src/cob/patch.rs
index 2c90e39e..7d27c2e6 100644
--- a/radicle/src/cob/patch.rs
+++ b/radicle/src/cob/patch.rs
@@ -652,8 +652,14 @@ impl CodeComment {
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct Review {
/// Review verdict.
+ ///
+ /// Nb. if the verdict is set and a subsequent review is made with
+ /// the verdict as `None`, the original verdict will be nullified.
verdict: LWWReg>,
/// Review general comment.
+ ///
+ /// Nb. if the comment is set and a subsequent review is made with
+ /// the comment as `None`, the original comment will be nullified.
comment: LWWReg >>,
/// Review inline code comments.
inline: LWWSet>,
@@ -1671,6 +1677,48 @@ mod test {
assert_eq!(review.comment(), Some("LGTM"));
}
+ #[test]
+ fn test_patch_review_remove_fields() {
+ let tmp = tempfile::tempdir().unwrap();
+ let (_, signer, project) = test::setup::context(&tmp);
+ let base = git::Oid::from_str("cb18e95ada2bb38aadd8e6cef0963ce37a87add3").unwrap();
+ let oid = git::Oid::from_str("518d5069f94c03427f694bb494ac1cd7d1339380").unwrap();
+ let mut patches = Patches::open(&project).unwrap();
+ let mut patch = patches
+ .create(
+ "My first patch",
+ "Blah blah blah.",
+ MergeTarget::Delegates,
+ base,
+ oid,
+ &[],
+ &signer,
+ )
+ .unwrap();
+
+ let (rid, _) = patch.latest().unwrap();
+ let rid = *rid;
+
+ patch
+ .review(
+ rid,
+ Some(Verdict::Reject),
+ Some("Nah".to_owned()),
+ vec![],
+ &signer,
+ )
+ .unwrap();
+ patch.review(rid, None, None, vec![], &signer).unwrap();
+
+ let id = patch.id;
+ let patch = patches.get_mut(&id).unwrap();
+ let (_, revision) = patch.latest().unwrap();
+
+ let review = revision.reviews.get(signer.public_key()).unwrap();
+ assert_eq!(review.verdict(), None);
+ assert_eq!(review.comment(), None);
+ }
+
#[test]
fn test_patch_update() {
let tmp = tempfile::tempdir().unwrap();