Skip to content

Commit

Permalink
unit test
Browse files Browse the repository at this point in the history
Signed-off-by: Attila Mészáros <[email protected]>
  • Loading branch information
csviri committed Feb 5, 2025
1 parent c2d039f commit 9616c74
Showing 1 changed file with 66 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
package io.javaoperatorsdk.operator.processing;

import java.util.Optional;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import io.fabric8.kubernetes.api.model.Secret;
import io.javaoperatorsdk.operator.MockKubernetesClient;
import io.javaoperatorsdk.operator.api.config.BaseConfigurationService;
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
import io.javaoperatorsdk.operator.api.config.MockControllerConfiguration;
import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec;
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
import io.javaoperatorsdk.operator.api.reconciler.DefaultContext;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflow;
import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult;
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;

import static io.javaoperatorsdk.operator.api.monitoring.Metrics.NOOP;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
Expand Down Expand Up @@ -61,4 +75,56 @@ void usesFinalizerIfThereIfReconcilerImplementsCleaner() {

assertThat(controller.useFinalizer()).isTrue();
}

@ParameterizedTest
@CsvSource({
"true, true, true, false",
"true, true, false, true",
"false, true, true, true",
"false, true, false, true",
"true, false, true, false",
})
void callsCleanupOnWorkflowWhenHasCleanerAndReconcilerIsNotCleaner(boolean reconcilerIsCleaner,
boolean workflowIsCleaner,
boolean isExplicitWorkflowInvocation,
boolean workflowCleanerExecuted) throws Exception {
Reconciler reconciler = mock(Reconciler.class);
if (reconcilerIsCleaner) {
reconciler = mock(Reconciler.class, withSettings().extraInterfaces(Cleaner.class));
}

final var configuration = MockControllerConfiguration.forResource(Secret.class);

if (reconciler instanceof Cleaner<?> cleaner) {
when(cleaner.cleanup(any(), any())).thenReturn(DeleteControl.noFinalizerRemoval());
}

var configurationService = mock(ConfigurationService.class);
var mockWorkflowFactory = mock(ManagedWorkflowFactory.class);
var mockManagedWorkflow = mock(ManagedWorkflow.class);

when(configuration.getConfigurationService()).thenReturn(configurationService);
var workflowSpec = mock(WorkflowSpec.class);
when(workflowSpec.isExplicitInvocation()).thenReturn(isExplicitWorkflowInvocation);
when(configuration.getWorkflowSpec()).thenReturn(Optional.of(workflowSpec));
when(configurationService.getMetrics()).thenReturn(NOOP);
when(configurationService.getWorkflowFactory()).thenReturn(mockWorkflowFactory);
when(mockWorkflowFactory.workflowFor(any())).thenReturn(mockManagedWorkflow);
var managedWorkflowMock = workflow(workflowIsCleaner);
when(mockManagedWorkflow.resolve(any(), any())).thenReturn(managedWorkflowMock);

final var controller = new Controller<Secret>(reconciler, configuration,
MockKubernetesClient.client(Secret.class));

controller.cleanup(new Secret(), new DefaultContext<>(null, controller, new Secret()));

verify(managedWorkflowMock, times(workflowCleanerExecuted ? 1 : 0)).cleanup(any(), any());
}

private Workflow workflow(boolean hasCleaner) {
var workflow = mock(Workflow.class);
when(workflow.cleanup(any(), any())).thenReturn(mock(WorkflowCleanupResult.class));
when(workflow.hasCleaner()).thenReturn(hasCleaner);
return workflow;
}
}

0 comments on commit 9616c74

Please sign in to comment.