Skip to content

Commit

Permalink
Merge pull request #76 from contentstack/next
Browse files Browse the repository at this point in the history
Next to master | added integrity hash | slack integration
  • Loading branch information
harshithad0703 authored Jun 4, 2024
2 parents 98c50aa + b3308b5 commit 267ed24
Show file tree
Hide file tree
Showing 13 changed files with 265 additions and 32 deletions.
7 changes: 7 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## v1.4.2

### May 27, 2024

- Sanity reports added
- Fixed Snyk issues

## v1.4.1
-Fix:
- removed isBlank() method
Expand Down
56 changes: 51 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<artifactId>cms</artifactId>
<packaging>jar</packaging>
<name>contentstack-management-java</name>
<version>1.4.1</version>
<version>1.4.2</version>
<description>Contentstack Java Management SDK for Content Management API, Contentstack is a headless CMS with an
API-first approach
</description>
Expand Down Expand Up @@ -89,11 +89,11 @@
<maven-javadoc-plugin.version>3.0.0</maven-javadoc-plugin.version>
<dotenv-source.version>5.2.2</dotenv-source.version>
<rxjava-source.version>3.1.8</rxjava-source.version>
<retrofit-source.version>2.9.0</retrofit-source.version>
<converter-gson-version>2.9.0</converter-gson-version>
<retrofit-source.version>2.10.0</retrofit-source.version>
<converter-gson-version>2.10.0</converter-gson-version>
<logging.version>5.0.0-alpha.12</logging.version>
<jococo-plugin.version>0.8.7</jococo-plugin.version>
<lombok-source.version>1.18.30</lombok-source.version>
<lombok-source.version>1.18.32</lombok-source.version>
<junit-jupiter.version>5.10.1</junit-jupiter.version>
<junit-jupiter-engine.version>5.8.0-M1</junit-jupiter-engine.version>
<gson.version>2.10.1</gson.version>
Expand Down Expand Up @@ -182,6 +182,46 @@
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>slack-api-client</artifactId>
<version>1.38.0</version>
</dependency>
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>slack-app-backend</artifactId>
<version>1.38.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.8.0</version>
<scope>test</scope>
</dependency>


</dependencies>


Expand All @@ -194,7 +234,13 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<skipTests>true</skipTests>
<!-- <includes>
<include>**/*TestSuite.java</include>
</includes> -->
<suiteXmlFiles>
<suiteXmlFile>${basedir}/testng.xml</suiteXmlFile>
</suiteXmlFiles>
<reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
Expand Down
2 changes: 1 addition & 1 deletion src/main/overview.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome file</title>
<link rel="stylesheet" href="https://stackedit.io/style.css" />
<link rel="stylesheet" href="https://stackedit.io/style.css" integrity="Y2zH5z5hlWA5qWiRJXFGomQWmbSsOts2cpzkG241KkqQVNx/1WD8YcZT+kq5w0H5" />
</head>

<body class="stackedit">
Expand Down
120 changes: 120 additions & 0 deletions src/test/java/com/contentstack/cms/SanityReport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package com.contentstack.cms;
import com.slack.api.Slack;
import com.slack.api.methods.SlackApiException;
import com.slack.api.methods.response.chat.ChatPostMessageResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class SanityReport {

public static String buildSlackMessage(File input) throws IOException {
Document doc = Jsoup.parse(input, "UTF-8");
Element summaryTable = doc.select("table.bodyTable").first();
Element summaryRow = summaryTable.select("tr.b").first();

String totalCount = summaryRow.select("td").get(0).text().trim();
String totalErrors = summaryRow.select("td").get(1).text().trim();
String totalFailures = summaryRow.select("td").get(2).text().trim();
String totalSkipped = summaryRow.select("td").get(3).text().trim();
String totalTime = summaryRow.select("td").get(5).text().trim();

int durationInMinutes = 0;
int durationInSeconds = 0;
if (!totalTime.isEmpty()) {
float timeInSeconds = Float.parseFloat(totalTime);
durationInMinutes = (int) timeInSeconds / 60;
durationInSeconds = (int) timeInSeconds % 60;
}
String slackMessage = String.format(
"*Test Summary of Java Management SDK*\n" +
"• Total Test Suite: *1*\n" +
"• Total Tests: *%s*\n" +
"• Total Pass: *%d*\n" +
"• Total Fail: *%s*\n" +
"• Total Skip: *%s*\n" +
"• Total Pending: *%s*\n" +
"• Total Duration: *%dm %ds*",
totalCount, Integer.parseInt(totalCount) - (Integer.parseInt(totalErrors) + Integer.parseInt(totalFailures)), totalFailures, totalSkipped, totalErrors, durationInMinutes, durationInSeconds
);
return slackMessage;
}

public static void publishMessage(String token, String channel, String text, File report) throws IOException, SlackApiException, InterruptedException {
try {
Slack slack = Slack.getInstance();

// Post the message to the Slack channel
ChatPostMessageResponse messageResponse = slack.methods(token).chatPostMessage(req -> req
.channel(channel)
.text(text)
);
// Check if posting message was successful
if (!messageResponse.isOk()) {
System.out.println("Message has not been posted");
}
// Upload report file (optional)
if (report != null) {
uploadFileToSlack(token, channel, report.getAbsolutePath());
}
} catch (IOException | SlackApiException e) {
System.out.println(e);
}
}

private static void uploadFileToSlack(String token, String channelName, String filePath) throws IOException, InterruptedException {
Path path = Paths.get(filePath);
String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
Map<String, String> params = new HashMap<>();
params.put("channels", channelName);
params.put("filename", new File(filePath).getName());
params.put("filetype", "text");
params.put("initial_comment", "Here is the report generated.");
params.put("title", "Reports File");

String body = buildMultipartBody(params, Files.readAllBytes(path), boundary);

HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://slack.com/api/files.upload"))
.header("Authorization", "Bearer " + token)
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(BodyPublishers.ofString(body))
.build();

HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

}


private static String buildMultipartBody(Map<String, String> params, byte[] fileContent, String boundary) {
StringBuilder sb = new StringBuilder();

for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append("--").append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"\r\n\r\n");
sb.append(entry.getValue()).append("\r\n");
}
sb.append("--").append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"").append(params.get("filename")).append("\"\r\n");
sb.append("Content-Type: application/octet-stream\r\n\r\n");
sb.append(new String(fileContent)).append("\r\n");
sb.append("--").append(boundary).append("--");
return sb.toString();
}

}


31 changes: 31 additions & 0 deletions src/test/java/com/contentstack/cms/SlackReportingListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.contentstack.cms;
import com.contentstack.cms.SanityReport;
import io.github.cdimascio.dotenv.Dotenv;
import java.io.File;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class SlackReportingListener implements ITestListener {
@Override
public void onFinish(ITestContext context) {
Dotenv dotenv = Dotenv.load();
String slackToken = dotenv.get("SLACK_BOT_TOKEN");
String slackChannel = dotenv.get("SLACK_CHANNEL");
File input = new File("./target/site/surefire-report.html");
try {
SanityReport.publishMessage(
slackToken,
slackChannel,
SanityReport.buildSlackMessage(input),
input
);
} catch (Exception e) {
System.out.println("Error sending Slack message: " + e.getMessage());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Tag("unit")
public
class OrgApiTests {

private static Organization ORG;
Expand Down Expand Up @@ -390,7 +391,7 @@ void testAllInvitationWithQuery() throws IOException {
.addHeader("api_key", TestClient.API_KEY)
.addParam("include_plan", true);
Response<ResponseBody> response = ORG.allInvitations().execute();
Assertions.assertFalse(response.isSuccessful());
Assertions.assertTrue(response.isSuccessful());
}

}
26 changes: 26 additions & 0 deletions src/test/java/com/contentstack/cms/stack/APISanityTestSuite.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.contentstack.cms.stack;
import com.contentstack.cms.organization.OrgApiTests;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.runner.RunWith;


@SuppressWarnings("deprecation")
@RunWith(JUnitPlatform.class)
@SelectClasses({
TaxonomyAPITest.class,
AssetAPITest.class,
ContentTypeAPITest.class,
EntryFieldsAPITest.class,
EnvironmentAPITest.class,
ExtensionAPITest.class,
LocaleAPITest.class,
RoleAPITest.class,
StackAPITest.class,
TokenAPITest.class,
OrgApiTests.class

})
public class APISanityTestSuite {

}
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ public void testEntryQuery() {
Assertions.assertEquals(4, request.url().pathSegments().size());
Assertions.assertEquals("v3", request.url().pathSegments().get(0));
Assertions.assertEquals("content_types", request.url().pathSegments().get(1));
Assertions.assertEquals("product", request.url().pathSegments().get(2));
Assertions.assertEquals("test", request.url().pathSegments().get(2));
Assertions.assertEquals("entries", request.url().pathSegments().get(3));
Assertions.assertNull(request.body());
Assertions.assertEquals("query={\"taxonomies.taxonomy_uid\":\"{ \\\"$in\\\" : [\\\"term_uid1\\\" , \\\"term_uid2\\\" ] }\"}", request.url().query());
Expand Down
14 changes: 7 additions & 7 deletions src/test/java/com/contentstack/cms/stack/ExtensionAPITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ void extensionGetAll() {
extension.addHeader("authtoken", AUTHTOKEN);
Request request = extension.find().request();

Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals(4, request.headers().names().size());
Assertions.assertEquals("GET", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -60,7 +60,7 @@ void getSingleWithUid() {
extension.addHeader("authtoken", AUTHTOKEN);
Request request = extension.fetch().request();

Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals(4, request.headers().names().size());
Assertions.assertEquals("GET", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -79,7 +79,7 @@ void extensionUpdate() {
extension.addHeader("authtoken", AUTHTOKEN);

Request request = extension.update(new JSONObject()).request();
Assertions.assertEquals(2, request.headers().names().size());
Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals("PUT", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -98,7 +98,7 @@ void extensionDelete() {
extension.addHeader("authtoken", AUTHTOKEN);
Request request = extension.delete().request();

Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals(4, request.headers().names().size());
Assertions.assertEquals("DELETE", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -116,7 +116,7 @@ void extensionGetSingle() {
extension.addHeader("authtoken", AUTHTOKEN);
Request request = extension.fetch().request();

Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals(4, request.headers().names().size());
Assertions.assertEquals("GET", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand Down Expand Up @@ -149,7 +149,7 @@ public void writeTo(BufferedSink sink) {
param.put("include_branch", false);
Request request = extension.uploadCustomField(params).request();

Assertions.assertEquals(2, request.headers().names().size());
Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals("POST", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -169,7 +169,7 @@ void extensionDeleteAgain() {
extension.addHeader("authtoken", AUTHTOKEN);
Request request = extension.delete().request();

Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals(4, request.headers().names().size());
Assertions.assertEquals("DELETE", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/com/contentstack/cms/stack/RoleAPITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ void updateRole() {
object.put("key", "value");

Request request = roles.update(object).request();
Assertions.assertEquals(2, request.headers().names().size());
Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals("PUT", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand All @@ -101,7 +101,7 @@ void deleteRole() {
roles.addHeader("authtoken", AUTHTOKEN);
roles.addHeader("api_key", API_KEY);
Request request = roles.delete().request();
Assertions.assertEquals(2, request.headers().names().size());
Assertions.assertEquals(3, request.headers().names().size());
Assertions.assertEquals("DELETE", request.method());
Assertions.assertTrue(request.url().isHttps());
Assertions.assertEquals("api.contentstack.io", request.url().host());
Expand Down
Loading

0 comments on commit 267ed24

Please sign in to comment.