From 6a51113d413b8ab30016e0b646af07d20c43888e Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 11 Dec 2022 19:49:31 +0100 Subject: [PATCH 1/5] fix: correct team-repository association --- .../mdas/githubstats/domain/Repository.java | 20 +++++++++++ .../pakland/mdas/githubstats/domain/Team.java | 16 +++++++-- .../controller/UserOptionController.java | 3 +- .../mdas/githubstats/domain/TeamTest.java | 36 +++++++++++++++++++ 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Repository.java b/src/main/java/io/pakland/mdas/githubstats/domain/Repository.java index 6a43bb1d..d683fdc7 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Repository.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Repository.java @@ -17,6 +17,7 @@ @NoArgsConstructor @AllArgsConstructor @Entity +@Builder @Table(name = "repository") public class Repository { @@ -46,4 +47,23 @@ public class Repository { private void unpackNameFromNestedObject(Map owner) { this.ownerLogin = owner.get("login"); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Repository that = (Repository) o; + + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java index 704abbf2..ea69215c 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java @@ -1,9 +1,7 @@ package io.pakland.mdas.githubstats.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import javax.persistence.*; import java.util.ArrayList; @@ -13,6 +11,7 @@ @NoArgsConstructor @AllArgsConstructor @Entity +@Builder @Table(name = "team") public class Team { @@ -41,4 +40,15 @@ public class Team { orphanRemoval = true ) private List repositories = new ArrayList<>(); + + public void addRepository(Repository repository) { + if (repositories == null) { + repositories = new ArrayList<>(); + } + + if (!repositories.contains(repository)) { + repositories.add(repository); + } + repository.setTeam(this); + } } diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java index 04e0ddbf..a3998f6f 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java @@ -54,7 +54,6 @@ public void execute() { for (Team team : teamList) { // Fetch the members of each team. - logger.info(organization.getLogin()); List userList = new FetchUsersFromTeam(userExternalRepository) .execute(organization.getLogin(), team.getSlug()); // Fetch the repositories for each team. @@ -62,6 +61,7 @@ public void execute() { .execute(organization.getLogin(), team.getSlug()); for (Repository repository : repositoryList) { + team.addRepository(repository); // Fetch pull requests from each team. List pullRequestList = new FetchPullRequestsFromRepository(pullRequestExternalRepository) .execute(repository.getOwnerLogin(), repository.getName()); @@ -77,7 +77,6 @@ public void execute() { } team.setUsers(userList); - team.setRepositories(repositoryList); } organization.setTeams(teamList); diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java new file mode 100644 index 00000000..fd0153a1 --- /dev/null +++ b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java @@ -0,0 +1,36 @@ +package io.pakland.mdas.githubstats.domain; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.Collections; +import org.junit.jupiter.api.Test; + +public class TeamTest { + + @Test + public void shouldAddTheRepository_andAssignTheTeamToTheRepository() { + Team team = Team.builder().id(1).slug("gs-developers").build(); + Repository repository = Repository.builder().id(1).name("github-stats").build(); + + assertNull(repository.getTeam()); + team.addRepository(repository); + + assertEquals(repository.getTeam(), team); + assertEquals(1, team.getRepositories().size()); + } + + @Test + public void shouldNotAddTheRepository_whenTheTeamIsAlreadyContained() { + Team team = Team.builder().id(1).slug("gs-developers").build(); + Repository repository = Repository.builder().id(1).name("github-stats").build(); + team.setRepositories(Collections.singletonList(repository)); + + assertNull(repository.getTeam()); + team.addRepository(repository); + + assertEquals(repository.getTeam(), team); + assertEquals(1, team.getRepositories().size()); + } + +} From aeebb9cb89c69a199f60ebf2b603656747f9faab Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 11 Dec 2022 19:57:31 +0100 Subject: [PATCH 2/5] fix: correct organization-team association --- .../mdas/githubstats/domain/Organization.java | 36 ++++++++++++++++--- .../pakland/mdas/githubstats/domain/Team.java | 19 ++++++++++ .../controller/UserOptionController.java | 3 +- .../githubstats/domain/OrganizationTest.java | 36 +++++++++++++++++++ .../mdas/githubstats/domain/TeamTest.java | 3 +- 5 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java index 93e7fa2b..c5fd3c0f 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java @@ -3,10 +3,7 @@ import javax.persistence.*; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import java.util.ArrayList; import java.util.List; @@ -15,6 +12,7 @@ @NoArgsConstructor @AllArgsConstructor @Entity +@Builder @Table(name = "organization") public class Organization { @Id @@ -32,4 +30,34 @@ public class Organization { orphanRemoval = true ) private List teams = new ArrayList<>(); + + public void addTeam(Team team) { + if (teams == null) { + teams = new ArrayList<>(); + } + + if (!teams.contains(team)) { + teams.add(team); + } + team.setOrganization(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Organization that = (Organization) o; + + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java index ea69215c..18e207af 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java @@ -51,4 +51,23 @@ public void addRepository(Repository repository) { } repository.setTeam(this); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Team team = (Team) o; + + return id.equals(team.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java index a3998f6f..a30304cc 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/controller/UserOptionController.java @@ -53,6 +53,7 @@ public void execute() { .execute(organization.getLogin()); for (Team team : teamList) { + organization.addTeam(team); // Fetch the members of each team. List userList = new FetchUsersFromTeam(userExternalRepository) .execute(organization.getLogin(), team.getSlug()); @@ -78,8 +79,6 @@ public void execute() { team.setUsers(userList); } - - organization.setTeams(teamList); } } catch (HttpException e) { throw new RuntimeException(e); diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java new file mode 100644 index 00000000..75530c4d --- /dev/null +++ b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java @@ -0,0 +1,36 @@ +package io.pakland.mdas.githubstats.domain; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.Collections; +import org.junit.jupiter.api.Test; + +public class OrganizationTest { + + @Test + public void shouldAddTheTeamToTheOrganization_andSetTheTeamOrganization() { + Organization organization = Organization.builder().id(1).login("github-stats").build(); + Team team = Team.builder().id(1).slug("gs-developers").build(); + + assertNull(team.getOrganization()); + organization.addTeam(team); + + assertEquals(organization.getTeams().size(), 1); + assertEquals(team.getOrganization(), organization); + } + + @Test + public void shouldNotAddTheTeam_whenTheTeamIsAlreadyContained() { + Organization organization = Organization.builder().id(1).login("github-stats").build(); + Team team = Team.builder().id(1).slug("gs-developers").build(); + organization.setTeams(Collections.singletonList(team)); + + assertNull(team.getOrganization()); + assertEquals(organization.getTeams().size(), 1); + organization.addTeam(team); + + assertEquals(organization.getTeams().size(), 1); + assertEquals(team.getOrganization(), organization); + } + +} diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java index fd0153a1..5f43ff5d 100644 --- a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java @@ -21,12 +21,13 @@ public void shouldAddTheRepository_andAssignTheTeamToTheRepository() { } @Test - public void shouldNotAddTheRepository_whenTheTeamIsAlreadyContained() { + public void shouldNotAddTheRepository_whenTheRepositoryIsAlreadyContained() { Team team = Team.builder().id(1).slug("gs-developers").build(); Repository repository = Repository.builder().id(1).name("github-stats").build(); team.setRepositories(Collections.singletonList(repository)); assertNull(repository.getTeam()); + assertEquals(1, team.getRepositories().size()); team.addRepository(repository); assertEquals(repository.getTeam(), team); From d0c9542af3a22ef9950d0f05ac94da4308d1bef5 Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Mon, 12 Dec 2022 15:27:10 +0100 Subject: [PATCH 3/5] fix: change `List` for `Set` on entities --- .../mdas/githubstats/domain/Organization.java | 87 +++++++++--------- .../pakland/mdas/githubstats/domain/Team.java | 92 +++++++++---------- .../githubstats/domain/OrganizationTest.java | 4 +- .../mdas/githubstats/domain/TeamTest.java | 2 +- 4 files changed, 90 insertions(+), 95 deletions(-) diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java index c5fd3c0f..6f601f96 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java @@ -1,13 +1,12 @@ package io.pakland.mdas.githubstats.domain; -import javax.persistence.*; - import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.NotNull; import lombok.*; -import java.util.ArrayList; -import java.util.List; - @Data @NoArgsConstructor @AllArgsConstructor @@ -15,49 +14,49 @@ @Builder @Table(name = "organization") public class Organization { - @Id - @Column(updatable = false, nullable = false) - @JsonProperty("id") - private Integer id; - - @Column - @JsonProperty("login") - private String login; - - @OneToMany( - mappedBy = "organization", - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private List teams = new ArrayList<>(); - - public void addTeam(Team team) { - if (teams == null) { - teams = new ArrayList<>(); - } - if (!teams.contains(team)) { - teams.add(team); + @Id + @Column(updatable = false, nullable = false) + @JsonProperty("id") + @NotNull + private Integer id; + + @Column + @JsonProperty("login") + private String login; + + @OneToMany( + mappedBy = "organization", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private Set teams = new HashSet<>(); + + public void addTeam(Team team) { + if (teams == null) { + teams = new HashSet<>(); + } + + teams.add(team); + team.setOrganization(this); } - team.setOrganization(this); - } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - Organization that = (Organization) o; + Organization that = (Organization) o; - return id.equals(that.id); - } + return id.equals(that.id); + } - @Override - public int hashCode() { - return id.hashCode(); - } + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java index 18e207af..1732589c 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java @@ -1,11 +1,9 @@ package io.pakland.mdas.githubstats.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.*; - +import java.util.*; import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; +import lombok.*; @Data @NoArgsConstructor @@ -15,59 +13,57 @@ @Table(name = "team") public class Team { - @Id - @Column(updatable = false, nullable = false) - @JsonProperty("id") - private Integer id; + @Id + @Column(updatable = false, nullable = false) + @JsonProperty("id") + private Integer id; - @Column(name = "slug") - @JsonProperty("slug") - private String slug; + @Column(name = "slug") + @JsonProperty("slug") + private String slug; - @ManyToOne(fetch = FetchType.LAZY) - private Organization organization; + @ManyToOne(fetch = FetchType.LAZY) + private Organization organization; - @OneToMany( - mappedBy = "team", - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private List users = new ArrayList<>(); + @OneToMany( + mappedBy = "team", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List users = new ArrayList<>(); - @OneToMany( - mappedBy = "team", - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private List repositories = new ArrayList<>(); + @OneToMany( + mappedBy = "team", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private Set repositories = new HashSet<>(); - public void addRepository(Repository repository) { - if (repositories == null) { - repositories = new ArrayList<>(); - } + public void addRepository(Repository repository) { + if (repositories == null) { + repositories = new HashSet<>(); + } - if (!repositories.contains(repository)) { - repositories.add(repository); + repositories.add(repository); + repository.setTeam(this); } - repository.setTeam(this); - } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - Team team = (Team) o; + Team team = (Team) o; - return id.equals(team.id); - } + return id.equals(team.id); + } - @Override - public int hashCode() { - return id.hashCode(); - } + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java index 75530c4d..484d71c6 100644 --- a/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java @@ -11,7 +11,7 @@ public class OrganizationTest { public void shouldAddTheTeamToTheOrganization_andSetTheTeamOrganization() { Organization organization = Organization.builder().id(1).login("github-stats").build(); Team team = Team.builder().id(1).slug("gs-developers").build(); - + assertNull(team.getOrganization()); organization.addTeam(team); @@ -23,7 +23,7 @@ public void shouldAddTheTeamToTheOrganization_andSetTheTeamOrganization() { public void shouldNotAddTheTeam_whenTheTeamIsAlreadyContained() { Organization organization = Organization.builder().id(1).login("github-stats").build(); Team team = Team.builder().id(1).slug("gs-developers").build(); - organization.setTeams(Collections.singletonList(team)); + organization.setTeams(Collections.singleton(team)); assertNull(team.getOrganization()); assertEquals(organization.getTeams().size(), 1); diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java index 5f43ff5d..b5033c19 100644 --- a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java @@ -24,7 +24,7 @@ public void shouldAddTheRepository_andAssignTheTeamToTheRepository() { public void shouldNotAddTheRepository_whenTheRepositoryIsAlreadyContained() { Team team = Team.builder().id(1).slug("gs-developers").build(); Repository repository = Repository.builder().id(1).name("github-stats").build(); - team.setRepositories(Collections.singletonList(repository)); + team.setRepositories(Collections.singleton(repository)); assertNull(repository.getTeam()); assertEquals(1, team.getRepositories().size()); From a3dde684b474194dae735dfde68191a1e3e0c162 Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Mon, 12 Dec 2022 15:35:42 +0100 Subject: [PATCH 4/5] fix: correct usage of `Set` --- .../application/GetRepositoriesByTeam.java | 2 +- .../application/GetTeamsFromOrganization.java | 2 +- .../mdas/githubstats/domain/Organization.java | 5 ++ .../pakland/mdas/githubstats/domain/Team.java | 4 ++ .../OrganizationGitHubRepositoryTest.java | 50 +++++++++-------- .../repository/TeamGitHubRepositoryTest.java | 54 +++++++++---------- 6 files changed, 62 insertions(+), 55 deletions(-) diff --git a/src/main/java/io/pakland/mdas/githubstats/application/GetRepositoriesByTeam.java b/src/main/java/io/pakland/mdas/githubstats/application/GetRepositoriesByTeam.java index 55ea5fbe..918e203f 100644 --- a/src/main/java/io/pakland/mdas/githubstats/application/GetRepositoriesByTeam.java +++ b/src/main/java/io/pakland/mdas/githubstats/application/GetRepositoriesByTeam.java @@ -14,7 +14,7 @@ public GetRepositoriesByTeam() {} @Transactional public List execute(Team team) { - return team.getRepositories(); + return team.getRepositories().stream().toList(); } } diff --git a/src/main/java/io/pakland/mdas/githubstats/application/GetTeamsFromOrganization.java b/src/main/java/io/pakland/mdas/githubstats/application/GetTeamsFromOrganization.java index 4f30d2bc..ba9d2a87 100644 --- a/src/main/java/io/pakland/mdas/githubstats/application/GetTeamsFromOrganization.java +++ b/src/main/java/io/pakland/mdas/githubstats/application/GetTeamsFromOrganization.java @@ -14,6 +14,6 @@ public GetTeamsFromOrganization() { } @Transactional public List execute(Organization org) { - return org.getTeams(); + return org.getTeams().stream().toList(); } } diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java index 6f601f96..ab97921e 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Organization.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -41,6 +42,10 @@ public void addTeam(Team team) { team.setOrganization(this); } + public List getTeams() { + return teams.stream().toList(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java index 1732589c..aa3fae29 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Team.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Team.java @@ -48,6 +48,10 @@ public void addRepository(Repository repository) { repository.setTeam(this); } + public List getRepositories() { + return repositories.stream().toList(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/OrganizationGitHubRepositoryTest.java b/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/OrganizationGitHubRepositoryTest.java index d3f31794..c21f3ae8 100644 --- a/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/OrganizationGitHubRepositoryTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/OrganizationGitHubRepositoryTest.java @@ -1,44 +1,41 @@ package io.pakland.mdas.githubstats.infrastructure.github.repository; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + import io.pakland.mdas.githubstats.application.exceptions.HttpException; import io.pakland.mdas.githubstats.domain.Organization; -import io.pakland.mdas.githubstats.domain.Team; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; @TestInstance(TestInstance.Lifecycle.PER_CLASS) class OrganizationGitHubRepositoryTest { + private final Integer organizationId = 119930124; private MockWebServer mockWebServer; private OrganizationGitHubRepository organizationGithubRepository; private String availableOrganizationsListResponse; - private final Integer organizationId = 119930124; - private final Integer teamId = 7098104; - @BeforeAll void setup() throws IOException { this.mockWebServer = new MockWebServer(); this.mockWebServer.start(); - WebClientConfiguration webClientConfiguration = new WebClientConfiguration(mockWebServer.url("/").toString(), "test-api-key"); - this.organizationGithubRepository = new OrganizationGitHubRepository(webClientConfiguration); - this.availableOrganizationsListResponse = new String(Files.readAllBytes(Paths.get("src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/responses/AvailableOrganizations.json"))); + WebClientConfiguration webClientConfiguration = new WebClientConfiguration( + mockWebServer.url("/").toString(), "test-api-key"); + this.organizationGithubRepository = new OrganizationGitHubRepository( + webClientConfiguration); + this.availableOrganizationsListResponse = new String(Files.readAllBytes(Paths.get( + "src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/responses/AvailableOrganizations.json"))); } @AfterAll @@ -47,10 +44,11 @@ void shutDown() throws IOException { } @Test - void givenValidUserOrganizationsRequest_shouldCallUserOrganizationsEndpoint() throws InterruptedException, HttpException { + void givenValidUserOrganizationsRequest_shouldCallUserOrganizationsEndpoint() + throws InterruptedException, HttpException { MockResponse mockResponse = new MockResponse() - .setBody(this.availableOrganizationsListResponse) - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + .setBody(this.availableOrganizationsListResponse) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); mockWebServer.enqueue(mockResponse); organizationGithubRepository.fetchAvailableOrganizations(); @@ -63,13 +61,13 @@ void givenValidUserOrganizationsRequest_shouldCallUserOrganizationsEndpoint() th void givenValidGithubAPIKey_shouldReturnAPIKeyUserOrganizations() throws HttpException { MockResponse mockResponse = new MockResponse() - .setBody(this.availableOrganizationsListResponse) - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + .setBody(this.availableOrganizationsListResponse) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); mockWebServer.enqueue(mockResponse); List response = organizationGithubRepository.fetchAvailableOrganizations(); List expected = new ArrayList<>(); - expected.add(new Organization(this.organizationId, "github-stats-22", new ArrayList())); + expected.add(new Organization(this.organizationId, "github-stats-22", new HashSet<>())); assertArrayEquals(response.toArray(), expected.toArray()); } diff --git a/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/TeamGitHubRepositoryTest.java b/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/TeamGitHubRepositoryTest.java index 2ede345f..983bb39b 100644 --- a/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/TeamGitHubRepositoryTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/TeamGitHubRepositoryTest.java @@ -1,44 +1,41 @@ package io.pakland.mdas.githubstats.infrastructure.github.repository; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + import io.pakland.mdas.githubstats.application.exceptions.HttpException; -import io.pakland.mdas.githubstats.domain.Repository; import io.pakland.mdas.githubstats.domain.Team; -import io.pakland.mdas.githubstats.domain.User; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; @TestInstance(TestInstance.Lifecycle.PER_CLASS) class TeamGitHubRepositoryTest { - private MockWebServer mockWebServer; - private TeamGitHubRepository teamGitHubRepository; - private String organizationTeamsListResponse; private final String organizationName = "github-stats-22"; private final String teamName = "gs-developers"; + private MockWebServer mockWebServer; + private TeamGitHubRepository teamGitHubRepository; + private String organizationTeamsListResponse; @BeforeAll void setup() throws IOException { this.mockWebServer = new MockWebServer(); this.mockWebServer.start(); - WebClientConfiguration webClientConfiguration = new WebClientConfiguration(mockWebServer.url("/").toString(), "test-api-key"); + WebClientConfiguration webClientConfiguration = new WebClientConfiguration( + mockWebServer.url("/").toString(), "test-api-key"); this.teamGitHubRepository = new TeamGitHubRepository(webClientConfiguration); - this.organizationTeamsListResponse = new String(Files.readAllBytes(Paths.get("src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/responses/OrganizationTeams.json"))); + this.organizationTeamsListResponse = new String(Files.readAllBytes(Paths.get( + "src/test/java/io/pakland/mdas/githubstats/infrastructure/github/repository/responses/OrganizationTeams.json"))); } @AfterAll @@ -47,10 +44,11 @@ void shutDown() throws IOException { } @Test - void givenValidTeamMembersRequest_shouldCallTeamMembersEndpoint() throws InterruptedException, HttpException { + void givenValidTeamMembersRequest_shouldCallTeamMembersEndpoint() + throws InterruptedException, HttpException { MockResponse mockResponse = new MockResponse() - .setBody(this.organizationTeamsListResponse) - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + .setBody(this.organizationTeamsListResponse) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); mockWebServer.enqueue(mockResponse); teamGitHubRepository.fetchTeamsFromOrganization(this.organizationName); @@ -62,13 +60,15 @@ void givenValidTeamMembersRequest_shouldCallTeamMembersEndpoint() throws Interru @Test void givenValidTeamName_shouldReturnTeamMembers() throws HttpException { MockResponse mockResponse = new MockResponse() - .setBody(this.organizationTeamsListResponse) - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + .setBody(this.organizationTeamsListResponse) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); mockWebServer.enqueue(mockResponse); - List response = teamGitHubRepository.fetchTeamsFromOrganization(this.organizationName); + List response = teamGitHubRepository.fetchTeamsFromOrganization( + this.organizationName); List expected = new ArrayList<>(); - expected.add(0, new Team(7098104, "gs-developers", null, new ArrayList(), new ArrayList())); + expected.add(0, + new Team(7098104, teamName, null, new ArrayList<>(), new HashSet<>())); assertEquals(1, response.size()); assertArrayEquals(response.toArray(), expected.toArray()); From 67e8da2d824cd173b4631b451d50188350a4c9ff Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Mon, 12 Dec 2022 15:36:11 +0100 Subject: [PATCH 5/5] test: add `equals` test to teams --- .../mdas/githubstats/domain/OrganizationTest.java | 15 ++++++++++++++- .../pakland/mdas/githubstats/domain/TeamTest.java | 14 +++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java index 484d71c6..a4b0c118 100644 --- a/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/domain/OrganizationTest.java @@ -1,8 +1,11 @@ package io.pakland.mdas.githubstats.domain; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; import java.util.Collections; +import java.util.HashSet; import org.junit.jupiter.api.Test; public class OrganizationTest { @@ -23,7 +26,7 @@ public void shouldAddTheTeamToTheOrganization_andSetTheTeamOrganization() { public void shouldNotAddTheTeam_whenTheTeamIsAlreadyContained() { Organization organization = Organization.builder().id(1).login("github-stats").build(); Team team = Team.builder().id(1).slug("gs-developers").build(); - organization.setTeams(Collections.singleton(team)); + organization.setTeams(new HashSet<>(Collections.singletonList(team))); assertNull(team.getOrganization()); assertEquals(organization.getTeams().size(), 1); @@ -33,4 +36,14 @@ public void shouldNotAddTheTeam_whenTheTeamIsAlreadyContained() { assertEquals(team.getOrganization(), organization); } + @Test + public void shouldCheckForEqualOrganizations() { + Organization original = Organization.builder().id(1).build(); + Organization equal = Organization.builder().id(1).build(); + Organization notEqual = Organization.builder().id(2).build(); + + assertEquals(original, equal); + assertNotEquals(original, notEqual); + } + } diff --git a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java index b5033c19..f96221d5 100644 --- a/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java +++ b/src/test/java/io/pakland/mdas/githubstats/domain/TeamTest.java @@ -1,9 +1,11 @@ package io.pakland.mdas.githubstats.domain; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; import java.util.Collections; +import java.util.HashSet; import org.junit.jupiter.api.Test; public class TeamTest { @@ -24,7 +26,7 @@ public void shouldAddTheRepository_andAssignTheTeamToTheRepository() { public void shouldNotAddTheRepository_whenTheRepositoryIsAlreadyContained() { Team team = Team.builder().id(1).slug("gs-developers").build(); Repository repository = Repository.builder().id(1).name("github-stats").build(); - team.setRepositories(Collections.singleton(repository)); + team.setRepositories(new HashSet<>(Collections.singletonList(repository))); assertNull(repository.getTeam()); assertEquals(1, team.getRepositories().size()); @@ -34,4 +36,14 @@ public void shouldNotAddTheRepository_whenTheRepositoryIsAlreadyContained() { assertEquals(1, team.getRepositories().size()); } + @Test + public void shouldCheckForEqualTeams() { + Team original = Team.builder().id(1).build(); + Team equal = Team.builder().id(1).build(); + Team notEqual = Team.builder().id(2).build(); + + assertEquals(original, equal); + assertNotEquals(original, notEqual); + } + }