Skip to content

Commit

Permalink
Add test cases for issue FasterXML#4119.
Browse files Browse the repository at this point in the history
  • Loading branch information
yihtserns committed Oct 5, 2023
1 parent 6960d93 commit 07a8d52
Showing 1 changed file with 145 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package com.fasterxml.jackson.databind.records;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonProperty.Access;
import com.fasterxml.jackson.databind.BaseMapTest;
import com.fasterxml.jackson.databind.ObjectMapper;

public class RecordWithReadOnlyTest extends BaseMapTest {

record RecordWithReadOnly(int id, @JsonProperty(access = Access.READ_ONLY) String name) {
}

record RecordWithReadOnlyNamedProperty(int id, @JsonProperty(value = "name", access = Access.READ_ONLY) String name) {
}

record RecordWithReadOnlyAccessor(int id, String name) {

@JsonProperty(access = Access.READ_ONLY)
@Override
public String name() {
return name;
}
}

record RecordWithReadOnlyComponentOverriddenAccessor(int id, @JsonProperty(access = Access.READ_ONLY) String name) {

// @JsonProperty on overridden method is not automatically inherited by overriding method
@Override
public String name() {
return name;
}
}

record RecordWithReadOnlyPrimitiveType(@JsonProperty(access = Access.READ_ONLY) int id, String name) {
}

record RecordWithReadOnlyAll(@JsonProperty(access = Access.READ_ONLY) int id,
@JsonProperty(access = Access.READ_ONLY) String name) {
}

private final ObjectMapper MAPPER = newJsonMapper();

/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY
/**********************************************************************
*/

public void testSerializeReadOnlyProperty() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnly(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyProperty() throws Exception {
RecordWithReadOnly value = MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnly.class);
assertEquals(new RecordWithReadOnly(123, null), value);
}

/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY + JsonProperty.value=...
/**********************************************************************
*/

public void testSerializeReadOnlyNamedProperty() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnlyNamedProperty(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyNamedProperty() throws Exception {
RecordWithReadOnlyNamedProperty value = MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnlyNamedProperty.class);
assertEquals(new RecordWithReadOnlyNamedProperty(123, null), value);
}

/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY accessor
/**********************************************************************
*/

public void testSerializeReadOnlyAccessor() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnlyAccessor(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyAccessor() throws Exception {
RecordWithReadOnlyAccessor expected = new RecordWithReadOnlyAccessor(123, null);

assertEquals(expected, MAPPER.readValue(a2q("{'id':123}"), RecordWithReadOnlyAccessor.class));
assertEquals(expected, MAPPER.readValue(a2q("{'id':123,'name':null}"), RecordWithReadOnlyAccessor.class));
assertEquals(expected, MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnlyAccessor.class));
}


/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY component, but accessor method was overridden without re-annotating with JsonProperty.access=READ_ONLY
/**********************************************************************
*/

public void testSerializeReadOnlyComponentOverrideAccessor() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnlyComponentOverriddenAccessor(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyComponentOverrideAccessor() throws Exception {
RecordWithReadOnlyComponentOverriddenAccessor expected = new RecordWithReadOnlyComponentOverriddenAccessor(123, null);

assertEquals(expected, MAPPER.readValue(a2q("{'id':123}"), RecordWithReadOnlyComponentOverriddenAccessor.class));
assertEquals(expected, MAPPER.readValue(a2q("{'id':123,'name':null}"), RecordWithReadOnlyComponentOverriddenAccessor.class));
assertEquals(expected, MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnlyComponentOverriddenAccessor.class));
}

/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY parameter of primitive type
/**********************************************************************
*/

public void testSerializeReadOnlyPrimitiveTypeProperty() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnlyPrimitiveType(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyPrimitiveTypeProperty() throws Exception {
RecordWithReadOnlyPrimitiveType value = MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnlyPrimitiveType.class);
assertEquals(new RecordWithReadOnlyPrimitiveType(0, "Bob"), value);
}

/*
/**********************************************************************
/* Test methods, JsonProperty.access=READ_ONLY all parameters
/**********************************************************************
*/

public void testSerializeReadOnlyAllProperties() throws Exception {
String json = MAPPER.writeValueAsString(new RecordWithReadOnlyAll(123, "Bob"));
assertEquals(a2q("{'id':123,'name':'Bob'}"), json);
}

public void testDeserializeReadOnlyAllProperties() throws Exception {
RecordWithReadOnlyAll value = MAPPER.readValue(a2q("{'id':123,'name':'Bob'}"), RecordWithReadOnlyAll.class);
assertEquals(new RecordWithReadOnlyAll(0, null), value);
}
}

0 comments on commit 07a8d52

Please sign in to comment.