From ba7f1ea4b9eb85adef450b4bc5adc9c128a1d765 Mon Sep 17 00:00:00 2001 From: gx040502 Date: Sat, 18 Apr 2026 22:31:13 +0800 Subject: [PATCH 1/3] feat: add unit tests, Jacoco coverage configuration, Dockerfile, and CI/CD pipeline workflow --- .github/workflows/ci.yml | 61 +++++++++++++++ Dockerfile | 14 ++++ build.gradle | 20 +++++ .../samples/music/domain/AlbumTest.java | 29 ++++++++ .../music/web/AlbumControllerTest.java | 74 +++++++++++++++++++ 5 files changed, 198 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 Dockerfile create mode 100644 src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java create mode 100644 src/test/java/org/cloudfoundry/samples/music/web/AlbumControllerTest.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..07ae4634c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,61 @@ +name: CI/CD Pipeline + +on: + push: + branches: [ "main", "master" ] + pull_request: + branches: [ "main", "master" ] + +jobs: + build-test-deploy: + runs-on: ubuntu-latest + + steps: + - name: Check out repository code + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + #(build) + #build and package + - name: Build and Package (JAR) + run: ./gradlew clean assemble + + #(test) + #run tests and generate coverage report + - name: Run Tests and Generate Coverage Report + run: ./gradlew test jacocoTestReport + + #upload jacoco test coverage artifact + - name: Upload Jacoco Test Coverage Artifact + uses: actions/upload-artifact@v4 + with: + name: Code-Coverage-Report + path: build/reports/jacoco/test/html/ + + #upload standard unit test results + - name: Upload Standard Unit Test Results + if: always() # Upload reports even if tests fail + uses: actions/upload-artifact@v4 + with: + name: Unit-Test-Results + path: build/reports/tests/test/ + + #(deploy) + #build docker image + - name: Build Docker Image (Deployment Staging) + run: docker build -t spring-music-app:latest . + + - name: Run and Verify Docker Container + run: | + docker run -d -p 8080:8080 --name spring-music-container spring-music-app:latest + sleep 10 + # Verify the container is actually running + docker ps | grep spring-music-container diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..01a4ec6cf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# Use an official lightweight Java 17 Runtime as the base image +FROM eclipse-temurin:17-jre-alpine + +# Set the working directory inside the container +WORKDIR /app + +# Copy the built JAR file into the container +COPY build/libs/spring-music-1.0.jar app.jar + +# Expose port 8080, which is the default port the Spring Boot app runs on +EXPOSE 8082 + +# Define the command to run the application when the container starts +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/build.gradle b/build.gradle index 92e1bf8a5..6e8c436ff 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,11 @@ plugins { id 'java' id 'eclipse-wtp' id 'idea' + id 'jacoco' +} + +jacoco { + toolVersion = "0.8.11" } group = 'org.cloudfoundry.samples.music' @@ -75,3 +80,18 @@ jar { tasks.named("bootBuildImage") { builder = "paketobuildpacks/builder-jammy-base:latest" } + +test { + testLogging { + events 'passed', 'skipped', 'failed' + } + finalizedBy jacocoTestReport +} + +jacocoTestReport { + dependsOn test + reports { + xml.required = true + html.required = true + } +} diff --git a/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java b/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java new file mode 100644 index 000000000..33c8d6085 --- /dev/null +++ b/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java @@ -0,0 +1,29 @@ +package org.cloudfoundry.samples.music.domain; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class AlbumTest { + + @Test + public void testAlbumGettersAndSetters() { + Album album = new Album("Test Title", "Test Artist", "2024", "Pop"); + album.setId("id123"); + album.setTrackCount(10); + album.setAlbumId("album123"); + + assertEquals("Test Title", album.getTitle()); + assertEquals("Test Artist", album.getArtist()); + assertEquals("2024", album.getReleaseYear()); + assertEquals("Pop", album.getGenre()); + assertEquals("id123", album.getId()); + assertEquals(10, album.getTrackCount()); + assertEquals("album123", album.getAlbumId()); + } + + @Test + public void testEmptyConstructor() { + Album album = new Album(); + assertNull(album.getTitle()); + } +} diff --git a/src/test/java/org/cloudfoundry/samples/music/web/AlbumControllerTest.java b/src/test/java/org/cloudfoundry/samples/music/web/AlbumControllerTest.java new file mode 100644 index 000000000..a2e7731ff --- /dev/null +++ b/src/test/java/org/cloudfoundry/samples/music/web/AlbumControllerTest.java @@ -0,0 +1,74 @@ +package org.cloudfoundry.samples.music.web; + +import org.cloudfoundry.samples.music.domain.Album; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.data.repository.CrudRepository; + +import java.util.Arrays; +import java.util.Optional; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class AlbumControllerTest { + + @Mock + private CrudRepository repository; + + @InjectMocks + private AlbumController albumController; + + @Test + public void testAlbums() { + Album album1 = new Album("Title1", "Artist1", "2020", "Pop"); + Album album2 = new Album("Title2", "Artist2", "2021", "Rock"); + when(repository.findAll()).thenReturn(Arrays.asList(album1, album2)); + + Iterable albums = albumController.albums(); + assertNotNull(albums); + int count = 0; + for (Album a : albums) count++; + assertEquals(2, count); + } + + @Test + public void testAdd() { + Album album = new Album("Title", "Artist", "2020", "Pop"); + when(repository.save(album)).thenReturn(album); + + Album added = albumController.add(album); + assertNotNull(added); + assertEquals("Title", added.getTitle()); + } + + @Test + public void testUpdate() { + Album album = new Album("Title", "Artist", "2020", "Pop"); + when(repository.save(album)).thenReturn(album); + + Album updated = albumController.update(album); + assertNotNull(updated); + assertEquals("Title", updated.getTitle()); + } + + @Test + public void testGetById() { + Album album = new Album("Title", "Artist", "2020", "Pop"); + when(repository.findById("1")).thenReturn(Optional.of(album)); + + Album fetched = albumController.getById("1"); + assertNotNull(fetched); + assertEquals("Title", fetched.getTitle()); + } + + @Test + public void testDeleteById() { + albumController.deleteById("1"); + verify(repository, times(1)).deleteById("1"); + } +} From cffa450ddc9f6d8a64aa016172f5590b4ad81e54 Mon Sep 17 00:00:00 2001 From: gx040502 Date: Sun, 19 Apr 2026 04:50:29 +0800 Subject: [PATCH 2/3] test: add domain unit tests, configure CI/CD pipeline, and update Docker port to 8085 --- .github/workflows/ci.yml | 2 +- Dockerfile | 4 +- build.gradle | 14 ++++ .../samples/music/domain/AlbumTest.java | 64 ++++++++++++++++--- .../music/domain/ApplicationInfoTest.java | 41 ++++++++++++ .../music/domain/RandomIdGeneratorTest.java | 39 +++++++++++ 6 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 src/test/java/org/cloudfoundry/samples/music/domain/ApplicationInfoTest.java create mode 100644 src/test/java/org/cloudfoundry/samples/music/domain/RandomIdGeneratorTest.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07ae4634c..27c66393a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: - name: Run and Verify Docker Container run: | - docker run -d -p 8080:8080 --name spring-music-container spring-music-app:latest + docker run -d -p 8085:8085 --name spring-music-container spring-music-app:latest sleep 10 # Verify the container is actually running docker ps | grep spring-music-container diff --git a/Dockerfile b/Dockerfile index 01a4ec6cf..127ea2df3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app COPY build/libs/spring-music-1.0.jar app.jar # Expose port 8080, which is the default port the Spring Boot app runs on -EXPOSE 8082 +EXPOSE 8085 # Define the command to run the application when the container starts -ENTRYPOINT ["java", "-jar", "app.jar"] +ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=8085"] diff --git a/build.gradle b/build.gradle index 6e8c436ff..3f6e250a4 100644 --- a/build.gradle +++ b/build.gradle @@ -90,6 +90,20 @@ test { jacocoTestReport { dependsOn test + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + 'org/cloudfoundry/samples/music/config/**', + 'org/cloudfoundry/samples/music/Application.class', + 'org/cloudfoundry/samples/music/repositories/redis/**', + 'org/cloudfoundry/samples/music/repositories/jpa/**', + 'org/cloudfoundry/samples/music/repositories/mongodb/**', + 'org/cloudfoundry/samples/music/repositories/AlbumRepositoryPopulator.class', + 'org/cloudfoundry/samples/music/web/ErrorController.class', + 'org/cloudfoundry/samples/music/web/InfoController.class' + ]) + })) + } reports { xml.required = true html.required = true diff --git a/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java b/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java index 33c8d6085..978b824ea 100644 --- a/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java +++ b/src/test/java/org/cloudfoundry/samples/music/domain/AlbumTest.java @@ -6,24 +6,72 @@ public class AlbumTest { @Test - public void testAlbumGettersAndSetters() { + public void testParameterizedConstructor() { Album album = new Album("Test Title", "Test Artist", "2024", "Pop"); - album.setId("id123"); - album.setTrackCount(10); - album.setAlbumId("album123"); - assertEquals("Test Title", album.getTitle()); assertEquals("Test Artist", album.getArtist()); assertEquals("2024", album.getReleaseYear()); assertEquals("Pop", album.getGenre()); - assertEquals("id123", album.getId()); - assertEquals(10, album.getTrackCount()); - assertEquals("album123", album.getAlbumId()); } @Test public void testEmptyConstructor() { Album album = new Album(); + assertNull(album.getId()); assertNull(album.getTitle()); + assertNull(album.getArtist()); + assertNull(album.getReleaseYear()); + assertNull(album.getGenre()); + assertNull(album.getAlbumId()); + assertEquals(0, album.getTrackCount()); + } + + @Test + public void testSetId() { + Album album = new Album(); + album.setId("id123"); + assertEquals("id123", album.getId()); + } + + @Test + public void testSetTitle() { + Album album = new Album(); + album.setTitle("My Title"); + assertEquals("My Title", album.getTitle()); + } + + @Test + public void testSetArtist() { + Album album = new Album(); + album.setArtist("My Artist"); + assertEquals("My Artist", album.getArtist()); + } + + @Test + public void testSetReleaseYear() { + Album album = new Album(); + album.setReleaseYear("2025"); + assertEquals("2025", album.getReleaseYear()); + } + + @Test + public void testSetGenre() { + Album album = new Album(); + album.setGenre("Rock"); + assertEquals("Rock", album.getGenre()); + } + + @Test + public void testSetTrackCount() { + Album album = new Album(); + album.setTrackCount(12); + assertEquals(12, album.getTrackCount()); + } + + @Test + public void testSetAlbumId() { + Album album = new Album(); + album.setAlbumId("album456"); + assertEquals("album456", album.getAlbumId()); } } diff --git a/src/test/java/org/cloudfoundry/samples/music/domain/ApplicationInfoTest.java b/src/test/java/org/cloudfoundry/samples/music/domain/ApplicationInfoTest.java new file mode 100644 index 000000000..f24ee6356 --- /dev/null +++ b/src/test/java/org/cloudfoundry/samples/music/domain/ApplicationInfoTest.java @@ -0,0 +1,41 @@ +package org.cloudfoundry.samples.music.domain; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class ApplicationInfoTest { + + @Test + public void testConstructorAndGetters() { + String[] profiles = {"mysql", "redis"}; + String[] services = {"db-service", "cache-service"}; + + ApplicationInfo info = new ApplicationInfo(profiles, services); + + assertArrayEquals(profiles, info.getProfiles()); + assertArrayEquals(services, info.getServices()); + } + + @Test + public void testSetProfiles() { + ApplicationInfo info = new ApplicationInfo(new String[]{}, new String[]{}); + String[] newProfiles = {"postgres"}; + info.setProfiles(newProfiles); + assertArrayEquals(newProfiles, info.getProfiles()); + } + + @Test + public void testSetServices() { + ApplicationInfo info = new ApplicationInfo(new String[]{}, new String[]{}); + String[] newServices = {"my-service"}; + info.setServices(newServices); + assertArrayEquals(newServices, info.getServices()); + } + + @Test + public void testEmptyArrays() { + ApplicationInfo info = new ApplicationInfo(new String[]{}, new String[]{}); + assertEquals(0, info.getProfiles().length); + assertEquals(0, info.getServices().length); + } +} diff --git a/src/test/java/org/cloudfoundry/samples/music/domain/RandomIdGeneratorTest.java b/src/test/java/org/cloudfoundry/samples/music/domain/RandomIdGeneratorTest.java new file mode 100644 index 000000000..bf7e5990e --- /dev/null +++ b/src/test/java/org/cloudfoundry/samples/music/domain/RandomIdGeneratorTest.java @@ -0,0 +1,39 @@ +package org.cloudfoundry.samples.music.domain; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class RandomIdGeneratorTest { + + @Test + public void testGenerateIdReturnsNonNull() { + RandomIdGenerator generator = new RandomIdGenerator(); + String id = generator.generateId(); + assertNotNull(id); + } + + @Test + public void testGenerateIdReturnsUUIDFormat() { + RandomIdGenerator generator = new RandomIdGenerator(); + String id = generator.generateId(); + // UUID format: 8-4-4-4-12 hex characters + assertTrue(id.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); + } + + @Test + public void testGenerateIdReturnsUniqueValues() { + RandomIdGenerator generator = new RandomIdGenerator(); + String id1 = generator.generateId(); + String id2 = generator.generateId(); + assertNotEquals(id1, id2); + } + + @Test + public void testGenerateViaHibernateInterface() { + RandomIdGenerator generator = new RandomIdGenerator(); + // Test the Hibernate IdentifierGenerator interface method + Object id = generator.generate(null, null); + assertNotNull(id); + assertTrue(id instanceof String); + } +} From afe2c55b5ef71e5bd9664b50b571b1b6df64cabd Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 19 Apr 2026 14:43:11 +0800 Subject: [PATCH 3/3] Change header text Albums to Albumss --- scc tan chi hong.docx | Bin 0 -> 42450 bytes src/main/resources/static/templates/albums.html | 2 +- ~$c tan chi hong.docx | Bin 0 -> 162 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 scc tan chi hong.docx create mode 100644 ~$c tan chi hong.docx diff --git a/scc tan chi hong.docx b/scc tan chi hong.docx new file mode 100644 index 0000000000000000000000000000000000000000..5e6b2741aa8f822d6886b049aa3eac626f9eca8a GIT binary patch literal 42450 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/templates/albums.html b/src/main/resources/static/templates/albums.html index 77baee53f..ac8eeb42d 100644 --- a/src/main/resources/static/templates/albums.html +++ b/src/main/resources/static/templates/albums.html @@ -1,6 +1,6 @@