Skip to content

Commit fc3cbf0

Browse files
coopernetesclaude
andcommitted
test: improve coverage for provider, config, service, and filter packages
Add unit tests for previously uncovered code: - ProviderTest: GitHubProvider, GitLabProvider, BitbucketProvider, GenericProxyProvider, InMemoryProviderRepository - ConfigTest: CommitConfig, GpgConfig, InMemoryFilterConfigurationSource, InMemoryProviderConfigurationSource - ServiceTest: DummyRepositoryService, DummyUserAuthorizationService - CheckUserPushPermissionFilterTest: null details, missing email, unknown user, unauthorized, authorized cases - WhitelistFilterTest: WhitelistByUrlFilter order validation, predicate matching (owner/name/slug), WhitelistAggregateFilter pass/block - GpgSignatureFilterTest: disabled config, null details, no commits, unsigned commit blocked/allowed, null config default Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 13423ce commit fc3cbf0

7 files changed

Lines changed: 1139 additions & 1 deletion

File tree

build.gradle

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,26 @@ allprojects {
2020

2121
subprojects {
2222
apply plugin: 'com.diffplug.spotless'
23-
23+
2424
spotless {
2525
java {
2626
palantirJavaFormat("${palantirJavaFormatVersion}").formatJavadoc(true)
2727
}
2828
}
29+
30+
plugins.withId('java') {
31+
apply plugin: 'jacoco'
32+
33+
jacocoTestReport {
34+
dependsOn test
35+
reports {
36+
xml.required = true
37+
html.required = true
38+
}
39+
}
40+
41+
test {
42+
finalizedBy jacocoTestReport
43+
}
44+
}
2945
}
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
package org.finos.gitproxy.config;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.Mockito.mock;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.regex.Pattern;
9+
import org.finos.gitproxy.provider.GitHubProvider;
10+
import org.finos.gitproxy.provider.GitLabProvider;
11+
import org.finos.gitproxy.provider.GitProxyProvider;
12+
import org.finos.gitproxy.servlet.filter.GitProxyFilter;
13+
import org.junit.jupiter.api.Test;
14+
15+
class ConfigTest {
16+
17+
// --- CommitConfig ---
18+
19+
@Test
20+
void commitConfig_defaultConfig_hasNoRestrictions() {
21+
CommitConfig config = CommitConfig.defaultConfig();
22+
assertNotNull(config);
23+
assertNotNull(config.getAuthor());
24+
assertNotNull(config.getAuthor().getEmail());
25+
assertNotNull(config.getAuthor().getEmail().getDomain());
26+
assertNotNull(config.getAuthor().getEmail().getLocal());
27+
assertNull(config.getAuthor().getEmail().getDomain().getAllow());
28+
assertNull(config.getAuthor().getEmail().getLocal().getBlock());
29+
assertNotNull(config.getMessage());
30+
assertNotNull(config.getMessage().getBlock());
31+
assertTrue(config.getMessage().getBlock().getLiterals().isEmpty());
32+
assertTrue(config.getMessage().getBlock().getPatterns().isEmpty());
33+
}
34+
35+
@Test
36+
void commitConfig_builder_setsEmailDomainAllow() {
37+
Pattern domainPattern = Pattern.compile("example\\.com$");
38+
CommitConfig config = CommitConfig.builder()
39+
.author(CommitConfig.AuthorConfig.builder()
40+
.email(CommitConfig.EmailConfig.builder()
41+
.domain(CommitConfig.DomainConfig.builder()
42+
.allow(domainPattern)
43+
.build())
44+
.build())
45+
.build())
46+
.build();
47+
assertSame(domainPattern, config.getAuthor().getEmail().getDomain().getAllow());
48+
}
49+
50+
@Test
51+
void commitConfig_builder_setsEmailLocalBlock() {
52+
Pattern blockPattern = Pattern.compile("^noreply$");
53+
CommitConfig config = CommitConfig.builder()
54+
.author(CommitConfig.AuthorConfig.builder()
55+
.email(CommitConfig.EmailConfig.builder()
56+
.local(CommitConfig.LocalConfig.builder()
57+
.block(blockPattern)
58+
.build())
59+
.build())
60+
.build())
61+
.build();
62+
assertSame(blockPattern, config.getAuthor().getEmail().getLocal().getBlock());
63+
}
64+
65+
@Test
66+
void commitConfig_builder_setsMessageBlockLiterals() {
67+
CommitConfig config = CommitConfig.builder()
68+
.message(CommitConfig.MessageConfig.builder()
69+
.block(CommitConfig.BlockConfig.builder()
70+
.literals(List.of("WIP", "DO NOT MERGE"))
71+
.build())
72+
.build())
73+
.build();
74+
assertEquals(
75+
List.of("WIP", "DO NOT MERGE"), config.getMessage().getBlock().getLiterals());
76+
}
77+
78+
@Test
79+
void commitConfig_builder_setsMessageBlockPatterns() {
80+
Pattern p = Pattern.compile("password\\s*=");
81+
CommitConfig config = CommitConfig.builder()
82+
.message(CommitConfig.MessageConfig.builder()
83+
.block(CommitConfig.BlockConfig.builder()
84+
.patterns(List.of(p))
85+
.build())
86+
.build())
87+
.build();
88+
assertEquals(1, config.getMessage().getBlock().getPatterns().size());
89+
assertSame(p, config.getMessage().getBlock().getPatterns().get(0));
90+
}
91+
92+
// --- GpgConfig ---
93+
94+
@Test
95+
void gpgConfig_defaultConfig_isDisabled() {
96+
GpgConfig config = GpgConfig.defaultConfig();
97+
assertFalse(config.isEnabled());
98+
assertFalse(config.isRequireSignedCommits());
99+
assertNull(config.getTrustedKeysFile());
100+
assertNull(config.getTrustedKeysInline());
101+
}
102+
103+
@Test
104+
void gpgConfig_builder_setsEnabled() {
105+
GpgConfig config =
106+
GpgConfig.builder().enabled(true).requireSignedCommits(true).build();
107+
assertTrue(config.isEnabled());
108+
assertTrue(config.isRequireSignedCommits());
109+
}
110+
111+
@Test
112+
void gpgConfig_builder_setsTrustedKeysFile() {
113+
GpgConfig config =
114+
GpgConfig.builder().trustedKeysFile("/path/to/keys.asc").build();
115+
assertEquals("/path/to/keys.asc", config.getTrustedKeysFile());
116+
}
117+
118+
@Test
119+
void gpgConfig_builder_setsTrustedKeysInline() {
120+
GpgConfig config =
121+
GpgConfig.builder().trustedKeysInline("-----BEGIN PGP...").build();
122+
assertEquals("-----BEGIN PGP...", config.getTrustedKeysInline());
123+
}
124+
125+
// --- InMemoryFilterConfigurationSource ---
126+
127+
@Test
128+
void filterConfig_globalFilters_returnedForAnyProvider() {
129+
GitProxyFilter globalFilter = mock(GitProxyFilter.class);
130+
var source = new InMemoryFilterConfigurationSource(Map.of(), List.of(globalFilter));
131+
132+
List<GitProxyFilter> result = source.getFiltersForProvider("github");
133+
assertEquals(1, result.size());
134+
assertSame(globalFilter, result.get(0));
135+
}
136+
137+
@Test
138+
void filterConfig_providerFilters_addedAfterGlobal() {
139+
GitProxyFilter globalFilter = mock(GitProxyFilter.class);
140+
GitProxyFilter providerFilter = mock(GitProxyFilter.class);
141+
var source =
142+
new InMemoryFilterConfigurationSource(Map.of("github", List.of(providerFilter)), List.of(globalFilter));
143+
144+
List<GitProxyFilter> result = source.getFiltersForProvider("github");
145+
assertEquals(2, result.size());
146+
assertSame(globalFilter, result.get(0));
147+
assertSame(providerFilter, result.get(1));
148+
}
149+
150+
@Test
151+
void filterConfig_unknownProvider_returnsOnlyGlobal() {
152+
GitProxyFilter globalFilter = mock(GitProxyFilter.class);
153+
GitProxyFilter providerFilter = mock(GitProxyFilter.class);
154+
var source =
155+
new InMemoryFilterConfigurationSource(Map.of("github", List.of(providerFilter)), List.of(globalFilter));
156+
157+
List<GitProxyFilter> result = source.getFiltersForProvider("gitlab");
158+
assertEquals(1, result.size());
159+
assertSame(globalFilter, result.get(0));
160+
}
161+
162+
@Test
163+
void filterConfig_getAllFilters_returnsGlobalAndProviderFilters() {
164+
GitProxyFilter globalFilter = mock(GitProxyFilter.class);
165+
GitProxyFilter providerFilter = mock(GitProxyFilter.class);
166+
var source =
167+
new InMemoryFilterConfigurationSource(Map.of("github", List.of(providerFilter)), List.of(globalFilter));
168+
169+
List<GitProxyFilter> all = source.getAllFilters();
170+
assertEquals(2, all.size());
171+
assertTrue(all.contains(globalFilter));
172+
assertTrue(all.contains(providerFilter));
173+
}
174+
175+
@Test
176+
void filterConfig_noArgConstructor_returnsEmpty() {
177+
var source = new InMemoryFilterConfigurationSource();
178+
assertTrue(source.getFiltersForProvider("github").isEmpty());
179+
assertTrue(source.getAllFilters().isEmpty());
180+
}
181+
182+
// --- InMemoryProviderConfigurationSource ---
183+
184+
@Test
185+
void providerConfig_fromMap_getProvider_returnsCorrect() {
186+
GitProxyProvider github = new GitHubProvider("/proxy");
187+
var source = new InMemoryProviderConfigurationSource(Map.of("github", github));
188+
assertSame(github, source.getProvider("github"));
189+
}
190+
191+
@Test
192+
void providerConfig_fromMap_unknownProvider_returnsNull() {
193+
var source = new InMemoryProviderConfigurationSource(Map.of());
194+
assertNull(source.getProvider("unknown"));
195+
}
196+
197+
@Test
198+
void providerConfig_fromList_getProvider_returnsCorrect() {
199+
GitProxyProvider github = new GitHubProvider("/proxy");
200+
GitProxyProvider gitlab = new GitLabProvider("/proxy");
201+
var source = new InMemoryProviderConfigurationSource(List.of(github, gitlab));
202+
assertSame(github, source.getProvider("github"));
203+
assertSame(gitlab, source.getProvider("gitlab"));
204+
}
205+
206+
@Test
207+
void providerConfig_fromList_getProviders_returnsAll() {
208+
GitProxyProvider github = new GitHubProvider("/proxy");
209+
GitProxyProvider gitlab = new GitLabProvider("/proxy");
210+
var source = new InMemoryProviderConfigurationSource(List.of(github, gitlab));
211+
assertEquals(2, source.getProviders().size());
212+
assertTrue(source.getProviders().containsAll(List.of(github, gitlab)));
213+
}
214+
215+
@Test
216+
void providerConfig_getProviders_returnsDefensiveCopy() {
217+
GitProxyProvider github = new GitHubProvider("/proxy");
218+
var source = new InMemoryProviderConfigurationSource(List.of(github));
219+
List<GitProxyProvider> list1 = source.getProviders();
220+
List<GitProxyProvider> list2 = source.getProviders();
221+
assertNotSame(list1, list2);
222+
}
223+
}

0 commit comments

Comments
 (0)