Skip to content

Commit c62265f

Browse files
Merge pull request #185 from contentstack/fix/dx-2373-skips-single-item
Fix/dx 2373 skips single item
2 parents bb9315e + 9d39ac5 commit c62265f

File tree

6 files changed

+117
-46
lines changed

6 files changed

+117
-46
lines changed

.github/workflows/issues-jira.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Create Jira Ticket for Github Issue
2+
3+
on:
4+
issues:
5+
types: [opened]
6+
7+
jobs:
8+
issue-jira:
9+
runs-on: ubuntu-latest
10+
steps:
11+
12+
- name: Login to Jira
13+
uses: atlassian/gajira-login@master
14+
env:
15+
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
16+
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
17+
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
18+
19+
- name: Create Jira Issue
20+
id: create_jira
21+
uses: atlassian/gajira-create@master
22+
with:
23+
project: ${{ secrets.JIRA_PROJECT }}
24+
issuetype: ${{ secrets.JIRA_ISSUE_TYPE }}
25+
summary: Github | Issue | ${{ github.event.repository.name }} | ${{ github.event.issue.title }}
26+
description: |
27+
*GitHub Issue:* ${{ github.event.issue.html_url }}
28+
29+
*Description:*
30+
${{ github.event.issue.body }}
31+
fields: "${{ secrets.ISSUES_JIRA_FIELDS }}"

.github/workflows/jira.yml

Lines changed: 0 additions & 33 deletions
This file was deleted.

.github/workflows/policy-scan.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Checks the security policy and configurations
2+
on:
3+
pull_request:
4+
types: [opened, synchronize, reopened]
5+
jobs:
6+
security-policy:
7+
if: github.event.repository.visibility == 'public'
8+
runs-on: ubuntu-latest
9+
defaults:
10+
run:
11+
shell: bash
12+
steps:
13+
- uses: actions/checkout@master
14+
- name: Checks for SECURITY.md policy file
15+
run: |
16+
if ! [[ -f "SECURITY.md" || -f ".github/SECURITY.md" ]]; then exit 1; fi
17+
security-license:
18+
if: github.event.repository.visibility == 'public'
19+
runs-on: ubuntu-latest
20+
defaults:
21+
run:
22+
shell: bash
23+
steps:
24+
- uses: actions/checkout@master
25+
- name: Checks for License file
26+
run: |
27+
expected_license_files=("LICENSE" "LICENSE.txt" "LICENSE.md" "License.txt")
28+
license_file_found=false
29+
current_year=$(date +"%Y")
30+
31+
for license_file in "${expected_license_files[@]}"; do
32+
if [ -f "$license_file" ]; then
33+
license_file_found=true
34+
# check the license file for the current year, if not exists, exit with error
35+
if ! grep -q "$current_year" "$license_file"; then
36+
echo "License file $license_file does not contain the current year."
37+
exit 2
38+
fi
39+
break
40+
fi
41+
done
42+
43+
if [ "$license_file_found" = false ]; then
44+
echo "No license file found. Please add a license file to the repository."
45+
exit 1
46+
fi

.github/workflows/sast-scan.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/main/java/com/contentstack/sdk/SyncStack.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,13 @@ protected synchronized void setJSON(@NotNull JSONObject jsonobject) {
7878
}
7979
}
8080
} else {
81-
logger.warning("'items' is not a valid list. Skipping processing."); // ✅ Prevent crashes
82-
syncItems = new ArrayList<>();
81+
if (itemsObj instanceof JSONObject) {
82+
syncItems = new ArrayList<>();
83+
syncItems.add(sanitizeJson((JSONObject) itemsObj));
84+
} else {
85+
logger.warning("'items' is not a valid list. Skipping processing.");
86+
syncItems = new ArrayList<>();
87+
}
8388
}
8489
} else {
8590
syncItems = new ArrayList<>();

src/test/java/com/contentstack/sdk/TestSyncStack.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,39 @@ void testSetJSON_JSONInjection() {
8181
assertEquals("&lt;script&gt;alert('Hacked');&lt;/script&gt;", items.get(0).optString("title"));
8282
}
8383

84+
/**
85+
* ✅ Should treat a lone JSONObject under "items" the same as a one‑element
86+
* array.
87+
*/
88+
@Test
89+
void testSetJSON_handlesSingleItemObject() {
90+
JSONObject input = new JSONObject()
91+
.put("items", new JSONObject()
92+
.put("title", "Single Entry")
93+
.put("uid", "entry123")
94+
.put("content_type", "blog"))
95+
.put("skip", 0)
96+
.put("total_count", 1)
97+
.put("limit", 10)
98+
.put("sync_token", "token123");
99+
100+
syncStack.setJSON(input);
101+
List<JSONObject> items = syncStack.getItems();
102+
103+
assertNotNull(items, "Items list should be initialised");
104+
assertEquals(1, items.size(), "Exactly one item expected");
105+
106+
JSONObject item = items.get(0);
107+
assertEquals("Single Entry", item.optString("title"));
108+
assertEquals("entry123", item.optString("uid"));
109+
assertEquals("blog", item.optString("content_type"));
110+
111+
assertEquals(0, syncStack.getSkip());
112+
assertEquals(1, syncStack.getCount());
113+
assertEquals(10, syncStack.getLimit());
114+
assertEquals("token123", syncStack.getSyncToken());
115+
}
116+
84117
/**
85118
* ✅ Test: Invalid `items` field (should not crash)
86119
*/

0 commit comments

Comments
 (0)