Skip to content

Commit 658023f

Browse files
committed
fix: extracted SnykUri to a SnykUriDetails
1 parent 01624d6 commit 658023f

File tree

4 files changed

+109
-17
lines changed

4 files changed

+109
-17
lines changed

plugin/META-INF/MANIFEST.MF

+3-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ Require-Bundle: org.eclipse.ui,
2525
org.eclipse.ui.genericeditor,
2626
org.eclipse.swt,
2727
org.eclipse.jface,
28-
com.google.gson;bundle-version="2.11.0"
28+
com.google.gson;bundle-version="2.11.0",
29+
org.junit,
30+
junit-jupiter-api
2931
Automatic-Module-Name: io.snyk.eclipse.plugin.tests
3032
Bundle-ActivationPolicy: lazy
3133
Bundle-ClassPath: .,

plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.snyk.languageserver.protocolextension;
22

3-
import static io.snyk.eclipse.plugin.domain.ProductConstants.DIAGNOSTIC_SOURCE_SNYK_CODE;
43
import static io.snyk.eclipse.plugin.domain.ProductConstants.DISPLAYED_CODE_QUALITY;
54
import static io.snyk.eclipse.plugin.domain.ProductConstants.DISPLAYED_CODE_SECURITY;
65
import static io.snyk.eclipse.plugin.domain.ProductConstants.LSP_SOURCE_TO_SCAN_PARAMS;
@@ -23,20 +22,16 @@
2322
import static io.snyk.eclipse.plugin.views.snyktoolview.ISnykToolView.getPlural;
2423

2524
import java.io.File;
26-
import java.io.UnsupportedEncodingException;
2725
import java.net.URI;
2826
import java.net.URISyntaxException;
29-
import java.net.URLDecoder;
3027
import java.nio.file.InvalidPathException;
3128
import java.nio.file.Path;
3229
import java.nio.file.Paths;
3330
import java.util.ArrayList;
3431
import java.util.Arrays;
3532
import java.util.Collections;
36-
import java.util.HashMap;
3733
import java.util.HashSet;
3834
import java.util.List;
39-
import java.util.Map;
4035
import java.util.Set;
4136
import java.util.concurrent.CompletableFuture;
4237
import java.util.concurrent.ExecutionException;
@@ -96,7 +91,6 @@
9691
import io.snyk.languageserver.SnykLanguageServer;
9792
import io.snyk.languageserver.protocolextension.messageObjects.Diagnostic316;
9893
import io.snyk.languageserver.protocolextension.messageObjects.FeatureFlagStatus;
99-
import io.snyk.languageserver.protocolextension.messageObjects.Fix;
10094
import io.snyk.languageserver.protocolextension.messageObjects.FolderConfig;
10195
import io.snyk.languageserver.protocolextension.messageObjects.FolderConfigsParam;
10296
import io.snyk.languageserver.protocolextension.messageObjects.HasAuthenticatedParam;
@@ -457,26 +451,21 @@ public CompletableFuture<ShowDocumentResult> showDocument(
457451
return null;
458452
}
459453

460-
String scheme = uri.getScheme();
461-
String filePath = uri.getPath();
462-
String product = SnykUriUtils.getDecodedParam(uri, "product");
463-
String action = SnykUriUtils.getDecodedParam(uri, "action");
464-
String issueId = SnykUriUtils.getDecodedParam(uri, "issueId");
454+
SnykUriDetails uriDetails = SnykUriDetails.fromURI(uri);
465455

466456
Issue issue;
467-
if ("snyk".equals(scheme) && product.equals(DIAGNOSTIC_SOURCE_SNYK_CODE)
468-
&& "showInDetailPanel".equals(action)) {
469-
issue = getIssueFromCache(filePath, issueId);
457+
if (uriDetails.isValid()) {
458+
issue = getIssueFromCache(uriDetails.filePath(), uriDetails.issueId());
470459
} else {
471460
SnykLogger.logInfo(String.format(
472461
"Invalid URI: scheme=%s, product=%s, action=%s, issue=%s",
473-
scheme, product, action, issueId));
462+
uriDetails.scheme(), uriDetails.product(), uriDetails.action(), uriDetails.issueId()));
474463
return super.showDocument(params);
475464
}
476465

477466
if (issue == null) {
478467
SnykLogger.logInfo(String.format(
479-
"Issue not found in the issueCache; issueId: %s", issueId));
468+
"Issue not found in the issueCache; issueId: %s", uriDetails.issueId()));
480469
return null;
481470
}
482471

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.snyk.languageserver.protocolextension;
2+
3+
import java.net.URI;
4+
import static io.snyk.eclipse.plugin.domain.ProductConstants.DIAGNOSTIC_SOURCE_SNYK_CODE;
5+
6+
public record SnykUriDetails(String scheme, String filePath, String product,
7+
String action, String issueId) {
8+
public static SnykUriDetails fromURI(URI uri) {
9+
return new SnykUriDetails(uri.getScheme(), uri.getPath(),
10+
SnykUriUtils.getDecodedParam(uri, "product"),
11+
SnykUriUtils.getDecodedParam(uri, "action"),
12+
SnykUriUtils.getDecodedParam(uri, "issueId"));
13+
}
14+
15+
public boolean isValid() {
16+
return ("snyk".equals(this.scheme())
17+
&& DIAGNOSTIC_SOURCE_SNYK_CODE.equals(this.product())
18+
&& "showInDetailPanel".equals(this.action()));
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.snyk.languageserver.protocolextension;
2+
3+
import static org.junit.jupiter.api.Assertions.assertFalse;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.net.URI;
7+
import java.net.URISyntaxException;
8+
9+
import org.junit.jupiter.api.Test;
10+
11+
import io.snyk.eclipse.plugin.domain.ProductConstants;
12+
13+
public class SnykUriDetailsTest {
14+
15+
private static final String BASE_URI_STRING =
16+
"snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts?product=Snyk+Code&issueId=id&action=showInDetailPanel";
17+
18+
private URI createSnykUri() throws URISyntaxException {
19+
return new URI(BASE_URI_STRING);
20+
}
21+
22+
@Test
23+
void testFromURI() throws URISyntaxException {
24+
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
25+
26+
assertTrue(details.scheme().equals("snyk"));
27+
assertTrue(details.filePath().equals(
28+
"/test_repos/project-with-vulns/routes/vulnCodeSnippet.ts"));
29+
assertTrue(details.product()
30+
.equals(ProductConstants.DIAGNOSTIC_SOURCE_SNYK_CODE));
31+
assertTrue(details.action().equals("showInDetailPanel"));
32+
assertTrue(details.issueId().equals("id"));
33+
}
34+
35+
@Test
36+
void testFromURINullProduct() throws URISyntaxException {
37+
URI uri = new URI("snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts?issueId=id&action=showInDetailPanel");
38+
SnykUriDetails details = SnykUriDetails.fromURI(uri);
39+
40+
assertTrue(details.scheme().equals("snyk"));
41+
assertTrue(details.filePath().equals("/test_repos/project-with-vulns/routes/vulnCodeSnippet.ts"));
42+
assertTrue(details.product() == null); // Check if product is null
43+
assertTrue(details.action().equals("showInDetailPanel"));
44+
assertTrue(details.issueId().equals("id"));
45+
}
46+
47+
@Test
48+
void testFromURIEmptyProduct() throws URISyntaxException {
49+
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
50+
51+
assertTrue(details.scheme().equals("snyk"));
52+
assertTrue(details.filePath().equals("/test_repos/project-with-vulns/routes/vulnCodeSnippet.ts"));
53+
assertFalse(details.product().isEmpty()); // Check if product is not
54+
// empty
55+
assertTrue(details.action().equals("showInDetailPanel"));
56+
assertTrue(details.issueId().equals("id"));
57+
}
58+
59+
@Test
60+
void testIsValidTrue() throws URISyntaxException {
61+
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
62+
63+
assertTrue(details.isValid());
64+
}
65+
66+
@Test
67+
void testIsValidFalse() throws URISyntaxException {
68+
URI uri = new URI("http://path/product/showInDetailPanel?issueId=id");
69+
SnykUriDetails details = SnykUriDetails.fromURI(uri);
70+
71+
assertFalse(details.isValid());
72+
}
73+
74+
@Test
75+
void testIsValidProductFalse() throws URISyntaxException {
76+
URI uri = new URI("snyk://path/null/showInDetailPanel?issueId=id");
77+
SnykUriDetails details = SnykUriDetails.fromURI(uri);
78+
79+
assertFalse(details.isValid());
80+
}
81+
}

0 commit comments

Comments
 (0)