/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.statepersistance;
import elemental.json.Json;
import elemental.json.JsonFactory;
import elemental.json.JsonObject;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.component.StateComponent;
import org.eclipse.che.ide.api.preferences.PreferencesManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import java.util.HashMap;
import java.util.Map;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test covers {@link AppStateManager} functionality.
*
* @author Artem Zatsarynnyi
* @author Dmitry Shnurenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class AppStateManagerTest {
private static final String WS_ID = "ws_id";
@Mock
private StateComponent component1;
@Mock
private StateComponent component2;
@Mock
private Promise<Void> promise;
@Mock
private Promise<String> contentPromise;
@Mock
private PreferencesManager preferencesManager;
@Mock
private JsonFactory jsonFactory;
@Mock
private JsonObject pref;
@Captor
private ArgumentCaptor<String> preferenceArgumentCaptor;
@Captor
private ArgumentCaptor<String> jsonArgumentCaptor;
private AppStateManager appStateManager;
@Before
public void setUp() {
Map<String, StateComponent> components = new HashMap<>();
components.put("component1", component1);
components.put("component2", component2);
when(preferencesManager.flushPreferences()).thenReturn(promise);
when(preferencesManager.getValue(AppStateManager.PREFERENCE_PROPERTY_NAME)).thenReturn("");
when(jsonFactory.parse(anyString())).thenReturn(pref = Json.createObject());
appStateManager = new AppStateManager(components, preferencesManager, jsonFactory);
}
@Test
public void shouldStoreStateInPreferences() throws Exception {
appStateManager.persistWorkspaceState(WS_ID);
verify(preferencesManager).flushPreferences();
}
@Test
public void shouldCallGetStateOnStateComponent() throws Exception {
appStateManager.persistWorkspaceState(WS_ID);
verify(component1, atLeastOnce()).getState();
verify(component2, atLeastOnce()).getState();
}
@Test
public void shouldStoreStateByWsId() throws Exception {
appStateManager.persistWorkspaceState(WS_ID);
verify(preferencesManager).setValue(preferenceArgumentCaptor.capture(), jsonArgumentCaptor.capture());
assertThat(preferenceArgumentCaptor.getValue()).isNotNull();
assertThat(preferenceArgumentCaptor.getValue()).isNotNull();
JsonObject object = Json.parse(jsonArgumentCaptor.getValue());
assertThat(object.hasKey(WS_ID)).isTrue();
}
@Test
public void shouldSaveStateInFile() throws Exception {
JsonObject object = Json.createObject();
object.put("key1", "value1");
when(component1.getState()).thenReturn(object);
appStateManager.persistWorkspaceState(WS_ID);
verify(component1).getState();
verify(preferencesManager).setValue(anyString(), jsonArgumentCaptor.capture());
assertThat(jsonArgumentCaptor.getValue()).isNotNull().isNotEmpty();
String value = jsonArgumentCaptor.getValue();
JsonObject jsonObject = Json.parse(value).getObject(WS_ID);
JsonObject workspace = jsonObject.getObject("workspace");
assertThat(workspace).isNotNull();
JsonObject jsonObject1 = workspace.getObject("component1");
assertThat(jsonObject1.jsEquals(object)).isTrue();
}
@Test
public void restoreShouldReadFromPreferences() throws Exception {
pref.put(WS_ID, Json.createObject());
appStateManager.restoreWorkspaceState(WS_ID);
verify(preferencesManager).getValue(AppStateManager.PREFERENCE_PROPERTY_NAME);
}
@Test
public void restoreShouldCallLoadState() throws Exception {
JsonObject ws = Json.createObject();
pref.put(WS_ID, ws);
JsonObject workspace = Json.createObject();
ws.put("workspace", workspace);
JsonObject comp1 = Json.createObject();
workspace.put("component1", comp1);
comp1.put("key1", "value1");
appStateManager.restoreWorkspaceState(WS_ID);
ArgumentCaptor<JsonObject> stateCaptor = ArgumentCaptor.forClass(JsonObject.class);
verify(component1).loadState(stateCaptor.capture());
JsonObject jsonObject = stateCaptor.getValue();
assertThat(jsonObject.hasKey("key1")).isTrue();
assertThat(jsonObject.getString("key1")).isEqualTo("value1");
}
}