gnodet-bot commented on code in PR #409:
URL: https://github.com/apache/maven-archiver/pull/409#discussion_r4108499595


##########
src/test/java/org/apache/maven/shared/archiver/BuildHelperTest.java:
##########
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.archiver;
+
+import org.apache.maven.api.model.Build;
+import org.apache.maven.api.model.Model;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class BuildHelperTest {
+    @Test
+    void getPluginHandlesNullPluginMap() {
+        Model model = mock(Model.class);
+        Build build = mock(Build.class);

Review Comment:
   ⚠️ **Mocking concrete model classes violates project conventions.** The 
existing tests in `MavenArchiverTest` consistently use 
`Model.newBuilder()...build()` and `Build.newBuilder()...build()` — the 
immutable builder pattern. Mocking `Model` and `Build` (concrete `@Immutable` 
classes) works with Mockito's inline mock maker, but it's fragile and 
inconsistent with the rest of the test suite.
   
   The problem: you can't make `getPluginsAsMap()` return null using the 
builder, because the standard implementation always returns a non-null map. 
This means the test is verifying a scenario that can't actually occur with the 
standard Maven model — only with a hypothetical non-standard `PluginContainer` 
implementation.
   
   If the goal is to test the defensive null check, mocking is acceptable here, 
but the test should document why mocking is necessary (the standard model can't 
produce this state). Consider adding a comment.



##########
src/test/java/org/apache/maven/shared/archiver/BuildHelperTest.java:
##########
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.archiver;
+
+import org.apache.maven.api.model.Build;
+import org.apache.maven.api.model.Model;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class BuildHelperTest {
+    @Test
+    void getPluginHandlesNullPluginMap() {
+        Model model = mock(Model.class);
+        Build build = mock(Build.class);
+        when(model.getBuild()).thenReturn(build);
+        when(build.getPluginsAsMap()).thenReturn(null);
+
+        assertThat(BuildHelper.getPlugin(model, 
"org.example:example-plugin")).isNull();

Review Comment:
   💡 **Missing coverage for the `getPluginManagement()` path.** The public 
`getPlugin(Model, String)` method (line 86-93) has two lookup paths:
   1. `getPlugin(build, pluginGa)` — tested here ✓
   2. `getPlugin(build.getPluginManagement(), pluginGa)` — when path 1 returns 
null and build is non-null
   
   In this test, `build.getPluginManagement()` returns null (Mockito default), 
so path 2 hits the `container == null` guard. But if `getPluginManagement()` 
returned a `PluginManagement` whose `getPluginsAsMap()` is null, the same NPE 
would occur. Consider adding a second test for that path:
   
   ```java
   @Test
   void getPluginHandlesNullPluginMapInPluginManagement() {
       Model model = mock(Model.class);
       Build build = mock(Build.class);
       PluginManagement mgmt = mock(PluginManagement.class);
       when(model.getBuild()).thenReturn(build);
       when(build.getPluginsAsMap()).thenReturn(Map.of()); // no match → falls 
through
       when(build.getPluginManagement()).thenReturn(mgmt);
       when(mgmt.getPluginsAsMap()).thenReturn(null);
   
       assertThat(BuildHelper.getPlugin(model, 
"org.example:example-plugin")).isNull();
   }
   ```



##########
src/test/java/org/apache/maven/shared/archiver/BuildHelperTest.java:
##########
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.archiver;
+
+import org.apache.maven.api.model.Build;
+import org.apache.maven.api.model.Model;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class BuildHelperTest {
+    @Test
+    void getPluginHandlesNullPluginMap() {
+        Model model = mock(Model.class);
+        Build build = mock(Build.class);
+        when(model.getBuild()).thenReturn(build);
+        when(build.getPluginsAsMap()).thenReturn(null);

Review Comment:
   🔴 **`Build` does not declare `getPluginsAsMap()` — it's inherited from 
`PluginContainer` via `BuildBase → PluginConfiguration → PluginContainer`.** 
The mock stubs `build.getPluginsAsMap()` but the private 
`getPlugin(PluginContainer, String)` method receives the `Build` object typed 
as `PluginContainer`. Mockito handles this correctly (the mock intercepts at 
the object level), but this is worth verifying actually runs green — did you 
run the full test suite (`mvn verify`), or only `-Dtest=BuildHelperTest`?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to