package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeConfigParam; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeProperties; import jnpf.exception.DataException; import org.junit.Before; import org.junit.Test; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; public class OnlyOfficePluginResolverTest { private OnlyOfficePluginResolver resolver; @Before public void setUp() { OnlyOfficeProperties properties = new OnlyOfficeProperties(); OnlyOfficeProperties.PluginDefinition definition = definition( "asc.{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F}", "http://localhost:4173/onlyoffice-plugins/", "0.1.0-dev", "http://localhost:30000"); Map definitions = new LinkedHashMap<>(); definitions.put("eln-template-annotator", definition); properties.getPlugins().setDefinitions(definitions); OnlyOfficeProperties.PluginSceneMapping mapping = new OnlyOfficeProperties.PluginSceneMapping(); mapping.setBizScene("eln.template.annotate"); mapping.setBizModule("eln.template"); mapping.setPluginCodes(Collections.singletonList("eln-template-annotator")); mapping.setAutostartPluginCode("eln-template-annotator"); mapping.setDisabledPluginGuids(Collections.singletonList( "asc.{AA2EA9B6-9EC2-415F-9762-634EE8D9A95E}")); properties.getPlugins().setScenes(Collections.singletonList(mapping)); resolver = new OnlyOfficePluginResolver(properties); } @Test public void emptySceneDoesNotResolvePlugin() { assertEquals(Collections.emptyList(), resolver.resolve(param(null, null, null))); } @Test public void validSceneBuildsManifestAndRuntimeContext() { OnlyOfficePluginResolver.ResolvedPlugin resolved = resolver.resolve( param("eln.template.annotate", "eln.template", "record-1")).get(0); assertEquals("http://localhost:4173/onlyoffice-plugins/0.1.0-dev/eln-template-annotator/config.json", resolved.getManifestUrl()); Map context = resolved.runtimeContext("file-1", "record-1"); assertEquals("file-1", context.get("documentId")); assertEquals("record-1", context.get("bizDataId")); assertEquals("eln.template", context.get("bizModule")); assertEquals("eln.template.annotate", context.get("bizScene")); assertEquals("0.1.0", context.get("pluginVersion")); assertNull(context.get("canAnnotate")); assertEquals("http://localhost:30000", context.get("apiBaseUrl")); assertEquals("eln-template-annotator", resolved.getPluginCode()); assertEquals("asc.{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F}", resolved.getGuid()); assertEquals(true, resolved.isAutostart()); assertEquals(Collections.singletonList("asc.{AA2EA9B6-9EC2-415F-9762-634EE8D9A95E}"), resolved.getDisabledPluginGuids()); } @Test public void multiplePluginsPreserveConfiguredOrder() { OnlyOfficeProperties properties = new OnlyOfficeProperties(); Map definitions = new LinkedHashMap<>(); definitions.put("plugin-b", definition("asc.{GUID-B}", "https://plugins.example.com", "2.0.0", "https://api-b.example.com")); definitions.put("plugin-a", definition("asc.{GUID-A}", "https://plugins.example.com", "1.0.0", "https://api-a.example.com")); properties.getPlugins().setDefinitions(definitions); OnlyOfficeProperties.PluginSceneMapping mapping = new OnlyOfficeProperties.PluginSceneMapping(); mapping.setBizScene("multi.scene"); mapping.setBizModule("multi.module"); mapping.setPluginCodes(java.util.Arrays.asList("plugin-a", "plugin-b")); properties.getPlugins().setScenes(Collections.singletonList(mapping)); List resolved = new OnlyOfficePluginResolver(properties) .resolve(param("multi.scene", "multi.module", "record-1")); assertEquals("asc.{GUID-A}", resolved.get(0).getGuid()); assertEquals("https://plugins.example.com/1.0.0/plugin-a/config.json", resolved.get(0).getManifestUrl()); assertEquals("asc.{GUID-B}", resolved.get(1).getGuid()); } @Test(expected = DataException.class) public void unknownPluginReferenceIsRejected() { OnlyOfficeProperties properties = new OnlyOfficeProperties(); OnlyOfficeProperties.PluginSceneMapping mapping = new OnlyOfficeProperties.PluginSceneMapping(); mapping.setBizScene("unknown.plugin"); mapping.setBizModule("eln.template"); mapping.setPluginCodes(Collections.singletonList("missing")); properties.getPlugins().setScenes(Collections.singletonList(mapping)); new OnlyOfficePluginResolver(properties).resolve(param("unknown.plugin", "eln.template", "record-1")); } @Test(expected = DataException.class) public void duplicatePluginGuidIsRejected() { OnlyOfficeProperties properties = new OnlyOfficeProperties(); Map definitions = new LinkedHashMap<>(); definitions.put("plugin-a", definition("asc.{SAME-GUID}", "https://plugins.example.com", "1.0.0", "https://api.example.com")); definitions.put("plugin-b", definition("asc.{SAME-GUID}", "https://plugins.example.com", "1.0.0", "https://api.example.com")); properties.getPlugins().setDefinitions(definitions); OnlyOfficeProperties.PluginSceneMapping mapping = new OnlyOfficeProperties.PluginSceneMapping(); mapping.setBizScene("duplicate.guid"); mapping.setBizModule("eln.template"); mapping.setPluginCodes(java.util.Arrays.asList("plugin-a", "plugin-b")); properties.getPlugins().setScenes(Collections.singletonList(mapping)); new OnlyOfficePluginResolver(properties).resolve(param("duplicate.guid", "eln.template", "record-1")); } @Test(expected = DataException.class) public void unknownSceneIsRejected() { resolver.resolve(param("eln.unknown", "eln.template", "record-1")); } @Test(expected = DataException.class) public void mismatchedModuleIsRejected() { resolver.resolve(param("eln.template.annotate", "other", "record-1")); } private OnlyOfficeConfigParam param(String bizScene, String bizModule, String bizDataId) { OnlyOfficeConfigParam param = new OnlyOfficeConfigParam(); param.setBizScene(bizScene); param.setBizModule(bizModule); param.setBizDataId(bizDataId); return param; } private OnlyOfficeProperties.PluginDefinition definition(String guid, String publicBaseUrl, String release, String apiBaseUrl) { OnlyOfficeProperties.PluginDefinition definition = new OnlyOfficeProperties.PluginDefinition(); definition.setGuid(guid); definition.setVersion(release.replace("-dev", "")); definition.setPublicBaseUrl(publicBaseUrl); definition.setRelease(release); definition.setApiBaseUrl(apiBaseUrl); return definition; } }