@Test
public void testUpdateSearch() throws IOException {
MetadataStorage mds = getMetadataStorage();
final String ns = "ns";
final MetadataEntity program = new NamespaceId(ns).app("app1").worker("wk1").toMetadataEntity();
Metadata meta = new Metadata(USER, tags("tag1", "tag2"), props("key1", "value1", "key2", "value2"));
MetadataRecord programRecord = new MetadataRecord(program, meta);
mds.apply(new Update(program, meta));
assertResults(mds, SearchRequest.of("value1").addNamespace(ns).build(), programRecord);
assertResults(mds, SearchRequest.of("value2").addNamespace(ns).build(), programRecord);
assertResults(mds, SearchRequest.of("tag2").addNamespace(ns).build(), programRecord);
mds.apply(new Update(program, new Metadata(USER, props("key1", "value3"))));
mds.apply(new Remove(program, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, USER, "key2"),
new ScopedNameOfKind(TAG, USER, "tag2"))));
programRecord = new MetadataRecord(program, new Metadata(USER, tags("tag1"), props("key1", "value3")));
assertEmpty(mds, SearchRequest.of("value1").addNamespace(ns).build());
assertResults(mds, SearchRequest.of("value3").addNamespace(ns).build(), programRecord);
assertEmpty(mds, SearchRequest.of("value2").addNamespace(ns).build());
assertEmpty(mds, SearchRequest.of("tag2").addNamespace(ns).build());
assertResults(mds, SearchRequest.of("tag1").addNamespace(ns).build(), programRecord);
mds.apply(new Drop(program));
}