@Test
  public void write_onPatchWithInnerObject_fullyWritesInnerObject() {
    TestData original = new TestData();
    TestData updated = new TestData();
    updated.setInnerData(new InnerTestData());

    Patch<TestData> patch =
        MakePatch.from(original).to(updated).with(new ReflectivePatchCalculator<>());
    JsonObject json = toJson(patch);

    assertTrue(json.has("innerData"));
    assertTrue(json.get("innerData").isJsonObject());

    JsonObject innerJson = json.get("innerData").getAsJsonObject();
    Collection<String[]> fields =
        Collections2.transform(
            innerJson.entrySet(),
            entry -> new String[] {entry.getKey(), entry.getValue().getAsString()});
    assertThat(
        fields,
        containsInAnyOrder(
            new String[] {"json-name-alias", "inner-named-value"},
            new String[] {"name1", "inner-value-1"},
            new String[] {"name2", "inner-value-2"}));
  }
 @Theory
 public void testParseDate(TestData data) {
   try {
     assertThat(testee.parseDate(data.getFile()), is(equalTo(data.getExpectedDate())));
   } catch (Exception ex) {
     ex.printStackTrace(System.err);
     throw ex;
   }
 }
  @Test
  public void write_onAliasedFieldName_writesAliasToJson() throws Exception {
    TestData original = new TestData();
    TestData updated = new TestData();
    updated.setAliasedName("updated-aliased-value");

    Patch<TestData> patch =
        MakePatch.from(original).to(updated).with(new ReflectivePatchCalculator<>());
    JsonObject json = toJson(patch);

    assertThat(json.get("json-name-alias").getAsString(), is("updated-aliased-value"));
  }
  @Test
  public void write_onPatchWithNull_writesNullToJson() throws Exception {
    TestData original = new TestData();
    TestData updated = new TestData();
    updated.setName2(null);

    Patch<TestData> patch =
        MakePatch.from(original).to(updated).with(new ReflectivePatchCalculator<>());
    JsonObject json = toJson(patch);

    assertTrue(json.get("name2").isJsonNull());
    assertThat(json.has("nullName"), is(false));
  }
  @Test
  public void write_onPatchWithUnchangedFields_writesOnlyChangedFieldsToJson() throws Exception {
    TestData original = new TestData();
    TestData updated = new TestData();
    updated.setName1("updated value");
    updated.setAliasedName(null);

    Patch<TestData> patch =
        MakePatch.from(original).to(updated).with(new ReflectivePatchCalculator<>());
    JsonObject json = toJson(patch);

    assertThat(json.get("name1").getAsString(), is("updated value"));
    assertTrue(json.get("json-name-alias").isJsonNull());
  }
  @Before
  public void setUp() {
    TestData.setSubscription();

    userDAO.create(TestData.USER);
    patternDAO.create(TestData.PATTERN);

    subscriptionDAO.create(TestData.SUBSCRIPTION);
  }