Skip to content

Commit f39aa74

Browse files
committed
test(app): cover missing query context paths
1 parent 5b87f61 commit f39aa74

4 files changed

Lines changed: 102 additions & 0 deletions

File tree

server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/JpaGovernanceQueryRepositoryTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,44 @@ void getReportInboxItems_toleratesMissingSkillButKeepsNamespaceContext() {
145145
assertThat(responses.get(0).subtitle()).isEqualTo("Spam");
146146
}
147147

148+
@Test
149+
void getReviewInboxItems_toleratesMissingVersionContext() {
150+
ReviewTask task = new ReviewTask(101L, 11L, "submitter");
151+
setField(task, "id", 4L);
152+
setField(task, "submittedAt", Instant.parse("2026-03-20T04:00:00Z"));
153+
154+
given(skillVersionRepository.findByIdIn(List.of(101L))).willReturn(List.of());
155+
156+
var responses = repository.getReviewInboxItems(List.of(task));
157+
158+
assertThat(responses).hasSize(1);
159+
assertThat(responses.get(0).type()).isEqualTo("REVIEW");
160+
assertThat(responses.get(0).title()).isEqualTo("Unknown target");
161+
assertThat(responses.get(0).namespace()).isNull();
162+
assertThat(responses.get(0).skillSlug()).isNull();
163+
assertThat(responses.get(0).subtitle()).isEqualTo("Pending review");
164+
}
165+
166+
@Test
167+
void getPromotionInboxItems_toleratesMissingSourceAndTargetContext() {
168+
PromotionRequest request = new PromotionRequest(201L, 101L, 12L, "submitter");
169+
setField(request, "id", 5L);
170+
setField(request, "submittedAt", Instant.parse("2026-03-20T05:00:00Z"));
171+
172+
given(skillRepository.findByIdIn(List.of(201L))).willReturn(List.of());
173+
given(skillVersionRepository.findByIdIn(List.of(101L))).willReturn(List.of());
174+
given(namespaceRepository.findByIdIn(List.of(12L))).willReturn(List.of());
175+
176+
var responses = repository.getPromotionInboxItems(List.of(request));
177+
178+
assertThat(responses).hasSize(1);
179+
assertThat(responses.get(0).type()).isEqualTo("PROMOTION");
180+
assertThat(responses.get(0).title()).isEqualTo("Unknown target");
181+
assertThat(responses.get(0).namespace()).isNull();
182+
assertThat(responses.get(0).skillSlug()).isNull();
183+
assertThat(responses.get(0).subtitle()).isEqualTo("Pending promotion");
184+
}
185+
148186
private void setField(Object target, String fieldName, Object value) {
149187
try {
150188
java.lang.reflect.Field field = target.getClass().getDeclaredField(fieldName);

server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/JpaMySkillQueryRepositoryTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,27 @@ void getSkillSummaries_usesViewerProjectionForNonOwner() {
109109
assertThat(responses.get(0).ownerPreviewVersion()).isNull();
110110
assertThat(responses.get(0).headlineVersion().status()).isEqualTo("PUBLISHED");
111111
}
112+
113+
@Test
114+
void getSkillSummaries_disablesPromotionWhenNamespaceContextIsMissing() {
115+
Skill skill = new Skill(101L, "orphan-skill", "user-1", SkillVisibility.PUBLIC);
116+
skill.setDisplayName("Orphan Skill");
117+
ReflectionTestUtils.setField(skill, "id", 4L);
118+
119+
SkillVersion publishedVersion = new SkillVersion(4L, "1.0.0", "user-1");
120+
publishedVersion.setStatus(SkillVersionStatus.PUBLISHED);
121+
ReflectionTestUtils.setField(publishedVersion, "id", 44L);
122+
ReflectionTestUtils.setField(publishedVersion, "createdAt", Instant.parse("2026-03-15T10:30:00Z"));
123+
124+
given(namespaceRepository.findByIdIn(List.of(101L))).willReturn(List.of());
125+
given(skillVersionRepository.findBySkillIdAndStatus(4L, SkillVersionStatus.PUBLISHED)).willReturn(List.of(publishedVersion));
126+
given(skillVersionRepository.findBySkillId(4L)).willReturn(List.of(publishedVersion));
127+
128+
var responses = repository.getSkillSummaries(List.of(skill), "user-1");
129+
130+
assertThat(responses).hasSize(1);
131+
assertThat(responses.get(0).namespace()).isNull();
132+
assertThat(responses.get(0).publishedVersion()).isNotNull();
133+
assertThat(responses.get(0).canSubmitPromotion()).isFalse();
134+
}
112135
}

server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/JpaProfileReviewQueryRepositoryTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,28 @@ void getProfileReviewSummaries_fallsBackToUserIdWhenSubmitterMissing() {
8181
assertThat(response.get(0).currentDisplayName()).isNull();
8282
assertThat(response.get(0).requestedDisplayName()).isEqualTo("NewName");
8383
}
84+
85+
@Test
86+
void getProfileReviewSummaries_toleratesInvalidSnapshotJson() {
87+
ProfileChangeRequest request = new ProfileChangeRequest(
88+
"user-2",
89+
"{invalid",
90+
"{also-invalid",
91+
ProfileChangeStatus.PENDING,
92+
"PASS",
93+
null
94+
);
95+
ReflectionTestUtils.setField(request, "id", 3L);
96+
ReflectionTestUtils.setField(request, "createdAt", Instant.parse("2026-03-19T08:00:00Z"));
97+
98+
UserAccount submitter = new UserAccount("user-2", "Current Name", "user2@example.com", null);
99+
given(userAccountRepository.findByIdIn(List.of("user-2"))).willReturn(List.of(submitter));
100+
101+
var response = repository.getProfileReviewSummaries(List.of(request));
102+
103+
assertThat(response).hasSize(1);
104+
assertThat(response.get(0).username()).isEqualTo("Current Name");
105+
assertThat(response.get(0).currentDisplayName()).isEqualTo("Current Name");
106+
assertThat(response.get(0).requestedDisplayName()).isNull();
107+
}
84108
}

server/skillhub-auth/src/test/java/com/iflytek/skillhub/auth/oauth/OAuthLoginFlowServiceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,21 @@ void resolveFailureRedirect_maps_access_denied_to_user_facing_page() {
4747

4848
assertThat(redirect).isEqualTo("/access-denied");
4949
}
50+
51+
@Test
52+
void consumeReturnTo_clearsUnsafeSessionValue() {
53+
OAuthLoginFlowService service = new OAuthLoginFlowService(
54+
List.of(),
55+
mock(AccessPolicy.class),
56+
mock(IdentityBindingService.class)
57+
);
58+
MockHttpServletRequest request = new MockHttpServletRequest();
59+
HttpSession session = request.getSession(true);
60+
session.setAttribute(OAuthLoginRedirectSupport.SESSION_RETURN_TO_ATTRIBUTE, "https://evil.example");
61+
62+
String returnTo = service.consumeReturnTo(session);
63+
64+
assertThat(returnTo).isNull();
65+
assertThat(session.getAttribute(OAuthLoginRedirectSupport.SESSION_RETURN_TO_ATTRIBUTE)).isNull();
66+
}
5067
}

0 commit comments

Comments
 (0)