blob: 4e70529528bd5136ea7c01d69abe7c2b73c158d6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.ide.impl.vlt.transport;
import static org.easymock.EasyMock.createMock;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;
import java.util.List;
import javax.jcr.Credentials;
import javax.jcr.Repository;
import org.apache.sling.ide.impl.vlt.AddOrUpdateNodeCommand;
import org.apache.sling.ide.impl.vlt.DeleteNodeCommand;
import org.apache.sling.ide.impl.vlt.GetNodeContentCommand;
import org.apache.sling.ide.impl.vlt.ReorderChildNodesCommand;
import org.apache.sling.ide.transport.Command;
import org.apache.sling.ide.transport.ResourceProxy;
import org.apache.sling.ide.transport.impl.DefaultBatcher;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
// TODO - this is not well-placed here, but in api-test we don't have access
// to a set of useful commands and I feel disclined to start a parallel
// set of stub commands just for that
public class DefaultBatcherTest {
private Repository mockRepo;
private Credentials credentials;
private DefaultBatcher batcher;
@Before
public void prepare() {
mockRepo = createMock(Repository.class);
credentials = createMock(Credentials.class);
batcher = new DefaultBatcher();
}
@Test
public void moreComprehensiveDeletesAreCompacted() {
testMoreComprehensiveDeletesAreCompacted("/content", "/content", "/content/sub");
}
@Test
public void moreComprehensiveDeletesAreCompacted_reverseOrder() {
testMoreComprehensiveDeletesAreCompacted("/content", "/content/sub", "/content");
}
private void testMoreComprehensiveDeletesAreCompacted(String expected, String firstPath, String... otherPaths) {
batcher.add(new DeleteNodeCommand(mockRepo, credentials, firstPath, null));
for ( String otherPath: otherPaths) {
batcher.add(new DeleteNodeCommand(mockRepo, credentials, otherPath, null));
}
List<Command<?>> batched = batcher.get();
assertThat(batched, hasSize(1));
Command<?> command = batched.get(0);
assertThat(command, instanceOf(DeleteNodeCommand.class));
assertThat(command.getPath(), equalTo(expected));
}
@Test
public void unrelatedDeletesAreNotCompacted() {
assertCommandsAreNotCompacted(new DeleteNodeCommand(mockRepo, credentials, "/content/branch", null),
new DeleteNodeCommand(mockRepo, credentials, "/content/sub", null));
}
public void assertCommandsAreNotCompacted(Command<?> first, Command<?> second) {
batcher.add(first);
batcher.add(second);
List<Command<?>> batched = batcher.get();
assertThat(batched, hasSize(2));
assertThat(batched.get(0), Matchers.<Command<?>> sameInstance(first));
assertThat(batched.get(1), Matchers.<Command<?>> sameInstance(second));
}
@Test
public void dataIsClearedBetweenCalls() {
batcher.add(new DeleteNodeCommand(mockRepo, credentials, "/content/branch", null));
batcher.get();
assertThat(batcher.get(), hasSize(0));
}
@Test
public void identicalAddOrUpdatesAreCompacted() {
AddOrUpdateNodeCommand first = new AddOrUpdateNodeCommand(mockRepo, credentials, null, null, new ResourceProxy("/content"), null);
AddOrUpdateNodeCommand second = new AddOrUpdateNodeCommand(mockRepo, credentials, null, null, new ResourceProxy("/content"), null);
batcher.add(first);
batcher.add(second);
List<Command<?>> batched = batcher.get();
assertThat(batched, hasSize(1));
Command<?> command = batched.get(0);
assertThat(command, instanceOf(AddOrUpdateNodeCommand.class));
assertThat(command.getPath(), equalTo("/content"));
}
@Test
public void unrelatedAddOrUpdatesAreNotCompacted() {
assertCommandsAreNotCompacted(new AddOrUpdateNodeCommand(mockRepo, credentials, null, null, new ResourceProxy("/content/a"), null),
new AddOrUpdateNodeCommand(mockRepo, credentials, null, null, new ResourceProxy("/content/b"), null));
}
@Test
public void identicalsReorderingsAreCompacted() {
ReorderChildNodesCommand first = new ReorderChildNodesCommand(mockRepo, credentials, new ResourceProxy("/content"), null);
ReorderChildNodesCommand second = new ReorderChildNodesCommand(mockRepo, credentials,new ResourceProxy("/content"), null);
batcher.add(first);
batcher.add(second);
List<Command<?>> batched = batcher.get();
assertThat(batched, hasSize(1));
Command<?> command = batched.get(0);
assertThat(command, instanceOf(ReorderChildNodesCommand.class));
assertThat(command.getPath(), equalTo("/content"));
}
@Test
public void unrelatedReorderingsAreNotCompacted() {
assertCommandsAreNotCompacted(new ReorderChildNodesCommand(mockRepo, credentials, new ResourceProxy("/content/a"), null),
new ReorderChildNodesCommand(mockRepo, credentials,new ResourceProxy("/content/b"), null));
}
@Test
public void unhandledCommandIsReturnedAsIs() {
assertCommandsAreNotCompacted(new GetNodeContentCommand(mockRepo, credentials, "/content", null),
new GetNodeContentCommand(mockRepo, credentials, "/content", null));
}
}