/*
* Copyright 2013 Hewlett-Packard Development Company, L.P
*
* Licensed 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 com.hp.alm.ali.idea.translate;
import com.hp.alm.ali.ServerVersion;
import com.hp.alm.ali.idea.IntellijTest;
import com.hp.alm.ali.idea.RestInvocations;
import com.hp.alm.ali.idea.model.Field;
import com.hp.alm.ali.idea.model.type.BacklogBlockedType;
import com.hp.alm.ali.idea.model.type.BuildDurationType;
import com.hp.alm.ali.idea.model.type.BuildStatusType;
import com.hp.alm.ali.idea.model.type.Context;
import com.hp.alm.ali.idea.model.type.ContextAware;
import com.hp.alm.ali.idea.rest.RestService;
import com.hp.alm.ali.idea.rest.ServerType;
import com.hp.alm.ali.idea.translate.filter.ExpressionResolver;
import com.hp.alm.ali.idea.translate.filter.FilterResolver;
import com.hp.alm.ali.idea.translate.filter.MultipleItemsResolver;
import com.hp.alm.ali.idea.translate.filter.TranslatorAsync;
import com.hp.alm.ali.idea.translate.filter.TranslatorSync;
import com.intellij.openapi.application.ApplicationManager;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.swing.SwingUtilities;
public class TranslateServiceTest extends IntellijTest {
private TranslateService translateService;
private RestService restService;
@Before
public void preClean() {
translateService = getComponent(TranslateService.class);
translateService.connectedTo(ServerType.AGM); // clear cache
restService = getComponent(RestService.class);
}
public TranslateServiceTest() {
super(ServerVersion.AGM);
}
@Test
public void testTranslateAsync() {
handler.async();
String value = translateService.translateAsync(new TranslatorAsync(), "VALUE", false, new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertTrue("Callback outside dispatch thread", SwingUtilities.isEventDispatchThread());
Assert.assertEquals("value", value);
}
});
}
});
Assert.assertEquals("Loading...", value);
}
@Test
public void testTranslateAsync_sync() {
String value = translateService.translateAsync(new TranslatorSync(), "VALUE", false, new ValueCallback() {
@Override
public void value(String value) {
Assert.fail("Not expected");
}
});
Assert.assertEquals("value", value);
}
@Test
public void testTranslateAsync_syncCallback() {
handler.async();
String value = translateService.translateAsync(new TranslatorSync(), "VALUE", true, new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertEquals("value", value);
}
});
}
});
Assert.assertEquals("value", value);
}
@Test
public void testTranslateAsync_empty() {
handler.async();
String value = translateService.translateAsync(new TranslatorAsync(), "", true, new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertEquals("", value);
}
});
}
});
Assert.assertEquals("", value);
}
@Test
public void testTranslateAsync_context() {
handler.async();
String value = translateService.translateAsync(new ContextTranslator(), "", true, new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertTrue("Callback outside dispatch thread", SwingUtilities.isEventDispatchThread());
Assert.assertEquals("foo", value);
}
});
}
});
Assert.assertEquals("Loading...", value);
}
private void doTestGetReferenceTranslator(boolean loadMetadata) {
if(loadMetadata) {
RestInvocations.loadMetadata(handler, "defect");
RestInvocations.loadMetadata(handler, "release-backlog-item");
}
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=actual-fix-time,attachment,in-bucket,changeset,build-closed,closing-version,closing-date,dev-comments,id,status,description,detected-by,build-detected,detected-in-rcyc,detected-in-rel,detection-version,creation-time,estimated-fix-time,extended-reference,fixed-on-date,has-change,has-linkage,has-others-linkage,last-modified,planned-closing-ver,priority,user-04,user-03,reproducible,severity,subject,name,user-02,user-01,watch-id,release-backlog-item.product-id,release-backlog-item.owner,release-backlog-item.blocked,release-backlog-item.entity-name,release-backlog-item.entity-type,release-backlog-item.feature-id,release-backlog-item.invested,release-backlog-item.kanban-status-id,release-backlog-item.linked-entities-info,release-backlog-item.no-of-sons,release-backlog-item.kanban-parent-status-id,release-backlog-item.rank,release-backlog-item.release-id,release-backlog-item.entity-id,release-backlog-item.remaining,release-backlog-item.sprint-id,release-backlog-item.status,release-backlog-item.kan-parent-duration,release-backlog-item.story-points,release-backlog-item.kan-status-duration,release-backlog-item.team-id,release-backlog-item.theme-id,release-backlog-item.estimated,release-backlog-item.watch-id,release-backlog-item.id,product-group-id&query={id[86]}&order-by={}", 200)
.content("entityServiceTest_entity.xml");
Translator translator = translateService.getReferenceTranslator("defect");
handler.async();
String value = translator.translate("86", new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertEquals("somewhat", value);
}
});
}
});
Assert.assertNull(value);
}
@Test
public void testGetReferenceTranslator() {
doTestGetReferenceTranslator(true);
}
@Test
public void testGetReferenceTranslator_caches() throws Throwable {
doTestGetReferenceTranslator(true);
handler.checkpoint();
// should be served from cache
Translator translator = translateService.getReferenceTranslator("defect");
String value = translator.translate("86", new ValueCallback() {
@Override
public void value(String value) {
Assert.fail("Not expected");
}
});
Assert.assertEquals("somewhat", value);
}
@Test
public void testGetReferenceTranslator_invalidatesCache() throws Throwable {
doTestGetReferenceTranslator(true);
handler.checkpoint();
translateService.connectedTo(ServerType.AGM);
// should query again (no metadata though)
doTestGetReferenceTranslator(false);
}
@Test
public void testListensForServerTypeEvent() {
Assert.assertTrue(restService._isRegistered(translateService));
}
@Test
public void testGetTranslator_reference() {
Field field = new Field("build-detected", "Detected in build");
field.setReferencedType("build-instance");
Translator translator = translateService.getTranslator(field);
Assert.assertTrue(translator instanceof EntityReferenceTranslator);
Assert.assertEquals("build-instance", ((EntityReferenceTranslator) translator).getTargetType());
}
@Test
public void testGetTranslator_type() {
Field field = new Field("duration", "Duration");
field.setClazz(BuildDurationType.class);
Translator translator = translateService.getTranslator(field);
Assert.assertTrue(translator instanceof BuildDurationType);
}
@Test
public void testGetTranslator_none() {
Field field = new Field("name", "Name");
field.setClazz(String.class);
Translator translator = translateService.getTranslator(field);
Assert.assertNull(translator);
}
@Test
public void testGetTranslator_typeNone() {
Field field = new Field("status", "Status");
field.setClazz(BuildStatusType.class);
Translator translator = translateService.getTranslator(field);
Assert.assertNull(translator);
}
@Test
public void testGetFilterResolver_reference() {
Field field = new Field("build-detected", "Detected in build");
field.setReferencedType("build-instance");
FilterResolver resolver = translateService.getFilterResolver(field);
Assert.assertTrue(resolver instanceof ExpressionResolver);
Assert.assertEquals("build-instance", ((EntityReferenceTranslator)((ExpressionResolver) resolver).getTranslator()).getTargetType());
}
@Test
public void testGetFilterResolver_type() {
Field field = new Field("duration", "Duration");
field.setClazz(BuildDurationType.class);
FilterResolver resolver = translateService.getFilterResolver(field);
Assert.assertTrue(resolver instanceof BuildDurationType);
}
@Test
public void testGetFilterResolver_none() {
Field field = new Field("name", "Name");
field.setClazz(String.class);
FilterResolver resolver = translateService.getFilterResolver(field);
Assert.assertNull(resolver);
}
@Test
public void testGetFilterResolver_list() {
Field field = new Field("severity", "Severity");
field.setListId(299);
FilterResolver resolver = translateService.getFilterResolver(field);
Assert.assertTrue(resolver instanceof MultipleItemsResolver);
}
@Test
public void testConvertQueryModelToView() {
Field field = new Field("status", "Status");
field.setClazz(BuildStatusType.class);
handler.async();
String value = translateService.convertQueryModelToView(field, "Success;\"\"", new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertEquals("Success;(no value)", value);
}
});
}
});
Assert.assertEquals("Success;(no value)", value);
}
@Test
public void testConvertQueryModelToView_none() {
Field field = new Field("name", "Name");
field.setClazz(String.class);
handler.async();
String value = translateService.convertQueryModelToView(field, "Success;\"\"", new ValueCallback() {
@Override
public void value(final String value) {
handler.done(new Runnable() {
@Override
public void run() {
Assert.assertEquals("Success;\"\"", value);
}
});
}
});
Assert.assertEquals("Success;\"\"", value);
}
@Test
public void testConvertQueryModelToREST() {
Field field = new Field("blocked", "Blocked");
field.setClazz(BacklogBlockedType.class);
String value = translateService.convertQueryModelToREST(field, "blocked");
Assert.assertEquals("'**'", value);
}
@Test
public void testConvertQueryModelToREST_none() {
Field field = new Field("name", "Name");
field.setClazz(String.class);
String value = translateService.convertQueryModelToREST(field, "blocked");
Assert.assertEquals("blocked", value);
}
@Test
public void isTranslated() {
Field field = new Field("duration", "Duration");
field.setClazz(BuildDurationType.class);
Assert.assertTrue(translateService.isTranslated(field));
}
@Test
public void isTranslated_negative() {
Field field = new Field("name", "Name");
field.setClazz(String.class);
Assert.assertFalse(translateService.isTranslated(field));
}
private static class ContextTranslator implements Translator, ContextAware {
@Override
public void setContext(Context context) {
}
@Override
public String translate(String value, final ValueCallback callback) {
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
@Override
public void run() {
callback.value("foo");
}
});
return null;
}
}
}