Skip to content

Commit

Permalink
init root group
Browse files Browse the repository at this point in the history
  • Loading branch information
gy2006 committed Dec 15, 2024
1 parent c1b3315 commit ba083c3
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/main/java/com/flowci/common/model/Variables.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
@Getter
public final class Variables extends HashMap<String, String> implements Serializable {

public static final Variables EMPTY = new Variables(0);

public Variables(int initialCapacity) {
super(initialCapacity);
}

public Variables() {
super(5);
}
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/flowci/flow/FlowConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.flowci.flow;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.flowci.flow.business.InitRootGroup;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
Expand All @@ -26,4 +29,13 @@ public RestClient templateRestClient(ObjectMapper objectMapper) {
httpMessageConverters.add(converter);
}).build();
}

@Bean
@ConditionalOnProperty(
name = "flowci.init.root-group",
havingValue = "true",
matchIfMissing = true)
public CommandLineRunner initRootGroup(InitRootGroup initRootGroup) {
return args -> initRootGroup.invoke();
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/flowci/flow/business/InitRootGroup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.flowci.flow.business;

public interface InitRootGroup {
void invoke();
}
35 changes: 35 additions & 0 deletions src/main/java/com/flowci/flow/business/impl/InitRootGroupImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.flowci.flow.business.impl;

import com.flowci.common.model.Variables;
import com.flowci.flow.business.InitRootGroup;
import com.flowci.flow.model.Group;
import com.flowci.flow.repo.GroupRepo;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@AllArgsConstructor
public class InitRootGroupImpl implements InitRootGroup {

private final GroupRepo groupRepo;

@Override
public void invoke() {
var optional = groupRepo.findById(Group.ROOT_ID);
if (optional.isPresent()) {
log.info("Root group '{}' already exists", Group.ROOT_NAME);
return;
}

var root = new Group();
root.setName(Group.ROOT_NAME);
root.setParentId(Group.ROOT_ID);
root.setVariables(Variables.EMPTY);
root.setCreatedBy("system");
root.setUpdatedBy("system");
groupRepo.save(root);
log.info("Root group '{}' is created", root.getName());
}
}
1 change: 1 addition & 0 deletions src/main/java/com/flowci/flow/model/Group.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
public class Group extends EntityBase {

public final static Long ROOT_ID = 10000L;
public final static String ROOT_NAME = "flows";

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groups_id_gen")
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/flowci/flow/repo/GroupRepo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.flowci.flow.repo;

import com.flowci.flow.model.Group;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface GroupRepo extends JpaRepository<Group, Long> {
}
28 changes: 24 additions & 4 deletions src/test/java/com/flowci/SpringTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@

import com.flowci.flow.repo.FlowRepo;
import com.flowci.flow.repo.FlowYamlRepo;
import com.flowci.flow.repo.GroupRepo;
import lombok.Getter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.util.StreamUtils;

import java.io.IOException;
Expand All @@ -22,13 +28,27 @@
HibernateJpaAutoConfiguration.class,
FlywayAutoConfiguration.class
})
@Import(SpringTest.MockRepositoriesConfig.class)
public abstract class SpringTest {

@MockBean
private FlowRepo flowRepo;
@Getter
@TestConfiguration
public static class MockRepositoriesConfig {

@MockBean
private FlowYamlRepo flowYamlRepo;
@MockBean
private FlowRepo flowRepo;

@MockBean
private FlowYamlRepo flowYamlRepo;

@MockBean
private GroupRepo groupRepo;
}

@DynamicPropertySource
static void initTestProperties(DynamicPropertyRegistry registry) {
registry.add("flowci.init.root-group", () -> "false");
}

protected static InputStream getResource(String path) {
return SpringTest.class.getClassLoader().getResourceAsStream(path);
Expand Down
46 changes: 46 additions & 0 deletions src/test/java/com/flowci/flow/business/InitRootGroupTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.flowci.flow.business;

import com.flowci.SpringTest;
import com.flowci.flow.model.Group;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

class InitRootGroupTest extends SpringTest {

@Autowired
private MockRepositoriesConfig repositoriesConfig;

@Autowired
private InitRootGroup initRootGroup;

@Test
void whenEmptyDatabase_thenDefaultRootGroupShouldBeCreated() {
var groupRepoMock = repositoriesConfig.getGroupRepo();
when(groupRepoMock.findById(any())).thenReturn(Optional.empty());

var argCaptor = ArgumentCaptor.forClass(Group.class);
when(groupRepoMock.save(argCaptor.capture())).thenReturn(mock(Group.class));

initRootGroup.invoke();
verify(groupRepoMock, times(1)).save(argCaptor.capture());

var groupParam = argCaptor.getValue();
assertEquals(Group.ROOT_NAME, groupParam.getName());
}

@Test
void whenRootGroupExisted_thenSkipToCreateIt() {
var groupRepoMock = repositoriesConfig.getGroupRepo();
when(groupRepoMock.findById(any())).thenReturn(Optional.of(mock(Group.class)));

initRootGroup.invoke();
verify(groupRepoMock, times(0)).save(any(Group.class));
}
}

0 comments on commit ba083c3

Please sign in to comment.