/*******************************************************************************
* Copyright (c) 2013 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package com.eclipsesource.tabris.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import org.eclipse.rap.json.JsonArray;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import com.eclipsesource.tabris.test.util.TabrisEnvironment;
public class ClientStoreImplTest {
@Rule
public TabrisEnvironment environment = new TabrisEnvironment();
@Test( expected = IllegalArgumentException.class )
public void testAddFailsWithNullKey() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( null, "bar" );
}
@Test( expected = IllegalArgumentException.class )
public void testAddFailsWithEmptyKey() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "", "bar" );
}
@Test( expected = IllegalArgumentException.class )
public void testAddFailsWithNullValue() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", null );
}
@Test
public void testAddPutsValue() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
assertEquals( "bar", store.get( "foo" ) );
}
@Test
public void testRemovesValue() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.remove( "foo" );
assertNull( store.get( "foo" ) );
}
@Test
public void testBulkRemovesValue() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.remove( "foo" ,"foo1" );
assertNull( store.get( "foo" ) );
assertNull( store.get( "foo1" ) );
}
@Test
public void testRemoveSendsAllRemovedKeys() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.remove( "foo" );
ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class );
verify( environment.getServiceObject() ).call( eq( "remove" ), captor.capture() );
JsonArray removedKeys = captor.getValue().get( "keys" ).asArray();
assertEquals( JsonValue.valueOf( "foo" ), removedKeys.get( 0 ) );
assertEquals( 1, removedKeys.size() );
}
@Test
public void testEmptyRemoveDoesntSendsRemovedKeys() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.remove();
verify( environment.getServiceObject(), never() ).call( eq( "remove" ), any( JsonObject.class ) );
}
@Test
public void testBulkRemovesSendsAllRemovedKeys() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.remove( "foo" ,"foo1" );
ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class );
verify( environment.getServiceObject() ).call( eq( "remove" ), captor.capture() );
JsonArray removedKeys = captor.getValue().get( "keys" ).asArray();
assertEquals( JsonValue.valueOf( "foo" ), removedKeys.get( 0 ) );
assertEquals( JsonValue.valueOf( "foo1" ), removedKeys.get( 1 ) );
assertEquals( 2, removedKeys.size() );
}
@Test
public void testBulkRemovesNotAllValues() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.add( "foo3", "bar" );
store.remove( "foo" ,"foo1" );
assertNull( store.get( "foo" ) );
assertNull( store.get( "foo1" ) );
assertEquals( "bar", store.get( "foo3" ) );
}
@Test
public void testClearRemovesAllValues() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.add( "foo3", "bar" );
store.clear();
assertNull( store.get( "foo" ) );
assertNull( store.get( "foo1" ) );
assertNull( store.get( "foo3" ) );
}
@Test
public void testClearSendsClearCall() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
store.add( "foo1", "bar" );
store.add( "foo3", "bar" );
store.clear();
verify( environment.getServiceObject() ).call( "clear", null );
}
@Test
public void testAddSendsAddCall() {
ClientStoreImpl store = new ClientStoreImpl();
store.add( "foo", "bar" );
ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class );
verify( environment.getServiceObject() ).call( eq( "add" ), captor.capture() );
assertEquals( "foo", captor.getValue().get( "key" ).asString() );
assertEquals( "bar", captor.getValue().get( "value" ).asString() );
}
@Test
public void testSynchronizeCallAddsValues() {
ClientStoreImpl store = new ClientStoreImpl();
JsonObject properties = new JsonObject();
properties.add( "foo", "bar" );
properties.add( "foo1", "bar1" );
environment.dispatchCallOnServiceObject( "synchronize", properties );
assertEquals( "bar", store.get( "foo" ) );
assertEquals( "bar1", store.get( "foo1" ) );
}
}