Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added code coverage #3

Merged
merged 2 commits into from
Oct 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
coverage/coverage.out
2 changes: 1 addition & 1 deletion bin/run
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash

set -e
set -e
SCRIPT_DIR=$(dirname $(realpath $0))

pushd ${SCRIPT_DIR}/../
Expand Down
10 changes: 10 additions & 0 deletions bin/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/bash

set -e
SCRIPT_DIR=$(dirname $(realpath $0))

pushd ${SCRIPT_DIR}/../
go test -coverprofile=coverage/coverage.out ./internal/application/... ./internal/domain/...
go tool cover -html=coverage/coverage.out -o=coverage/coverage.html
rm coverage/coverage.out
popd
236 changes: 236 additions & 0 deletions coverage/coverage.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>pong: Go Coverage Report</title>
<style>
body {
background: black;
color: rgb(80, 80, 80);
}
body, pre, #legend span {
font-family: Menlo, monospace;
font-weight: bold;
}
#topbar {
background: black;
position: fixed;
top: 0; left: 0; right: 0;
height: 42px;
border-bottom: 1px solid rgb(80, 80, 80);
}
#content {
margin-top: 50px;
}
#nav, #legend {
float: left;
margin-left: 10px;
}
#legend {
margin-top: 12px;
}
#nav {
margin-top: 10px;
}
#legend span {
margin: 0 5px;
}
.cov0 { color: rgb(192, 0, 0) }
.cov1 { color: rgb(128, 128, 128) }
.cov2 { color: rgb(116, 140, 131) }
.cov3 { color: rgb(104, 152, 134) }
.cov4 { color: rgb(92, 164, 137) }
.cov5 { color: rgb(80, 176, 140) }
.cov6 { color: rgb(68, 188, 143) }
.cov7 { color: rgb(56, 200, 146) }
.cov8 { color: rgb(44, 212, 149) }
.cov9 { color: rgb(32, 224, 152) }
.cov10 { color: rgb(20, 236, 155) }

</style>
</head>
<body>
<div id="topbar">
<div id="nav">
<select id="files">

<option value="file0">github.com/mmadariaga/go-api/internal/application/pong/Pong.go (100.0%)</option>

<option value="file1">github.com/mmadariaga/go-api/internal/application/races/GetRacesByYear.go (100.0%)</option>

<option value="file2">github.com/mmadariaga/go-api/internal/domain/service/GetDriversByRace.go (100.0%)</option>

<option value="file3">github.com/mmadariaga/go-api/internal/domain/service/GetPodiumByRace.go (100.0%)</option>

</select>
</div>
<div id="legend">
<span>not tracked</span>

<span class="cov0">not covered</span>
<span class="cov8">covered</span>

</div>
</div>
<div id="content">

<pre class="file" id="file0" style="display: none">package application_pong

func Pong() string <span class="cov8" title="1">{
return "pong"
}</span>
</pre>

<pre class="file" id="file1" style="display: none">package application_races

import (
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
domain_service "github.com/mmadariaga/go-api/internal/domain/service"
)

type Response struct {
domain_model.Race
Podium [3]domain_model.Podium `json:"podium"`
}

type GetRacesByYearDependencies interface {
domain_service.GetPodiumByRaceDependencies
FetchRacesByYear(year int) ([]domain_model.Race, error)
}

func GetRacesByYear(
year int,
dependencies GetRacesByYearDependencies,
) ([]Response, error) <span class="cov8" title="1">{

races, error := dependencies.FetchRacesByYear(year)
if error != nil </span><span class="cov8" title="1">{
return nil, error
}</span>

<span class="cov8" title="1">podiumsByRace, error := domain_service.GetPodiumByRace(
races,
dependencies,
)
if error != nil </span><span class="cov8" title="1">{
return nil, error
}</span>

<span class="cov8" title="1">response := make([]Response, 0, len(races))
for _, race := range races </span><span class="cov8" title="1">{

podium := podiumsByRace[race.Id]

response = append(
response,
Response{
Race: domain_model.Race{
Id: race.Id,
Year: race.Year,
StartDate: race.StartDate,
CountryName: race.CountryName,
CircuitName: race.CircuitName,
},
Podium: podium,
},
)
}</span>

<span class="cov8" title="1">return response, nil</span>
}
</pre>

<pre class="file" id="file2" style="display: none">package domain_service

import (
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
)

type GetDriversByRaceDependencies interface {
FetchDriversByRace(raceId int) ([]domain_model.Driver, error)
}

func GetDriversByRace(races []domain_model.Race, dependencies GetDriversByRaceDependencies) (map[int][]domain_model.Driver, error) <span class="cov8" title="1">{

driversByRace := make(map[int][]domain_model.Driver)

for _, race := range races </span><span class="cov8" title="1">{
result, error := dependencies.FetchDriversByRace(race.Id)
if error != nil </span><span class="cov8" title="1">{
return nil, error
}</span>

<span class="cov8" title="1">driversByRace[race.Id] = result</span>
}

<span class="cov8" title="1">return driversByRace, nil</span>
}
</pre>

<pre class="file" id="file3" style="display: none">package domain_service

import (
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
)

type GetPodiumByRaceDependencies interface {
GetDriversByRaceDependencies
FetchPodiumByRace(raceId int, drivers []domain_model.Driver) ([3]domain_model.Podium, error)
}

func GetPodiumByRace(
races []domain_model.Race,
dependencies GetPodiumByRaceDependencies,
) (map[int][3]domain_model.Podium, error) <span class="cov8" title="1">{

podiumsByRace := make(map[int][3]domain_model.Podium)

drivers, error := GetDriversByRace(races, dependencies)
if error != nil </span><span class="cov8" title="1">{
return nil, error
}</span>

<span class="cov8" title="1">for _, race := range races </span><span class="cov8" title="1">{
result, error := dependencies.FetchPodiumByRace(race.Id, drivers[race.Id])
if error != nil </span><span class="cov8" title="1">{
return nil, error
}</span>

<span class="cov8" title="1">podiumsByRace[race.Id] = result</span>
}

<span class="cov8" title="1">return podiumsByRace, nil</span>
}
</pre>

</div>
</body>
<script>
(function() {
var files = document.getElementById('files');
var visible;
files.addEventListener('change', onChange, false);
function select(part) {
if (visible)
visible.style.display = 'none';
visible = document.getElementById(part);
if (!visible)
return;
files.value = part;
visible.style.display = 'block';
location.hash = part;
}
function onChange() {
select(files.value);
window.scrollTo(0, 0);
}
if (location.hash != "") {
select(location.hash.substr(1));
}
if (!visible) {
select("file0");
}
})();
</script>
</html>
99 changes: 99 additions & 0 deletions internal/application/races/GetRacesByYear_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package application_races

import (
"errors"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -60,6 +61,104 @@ func TestGetRacesByYear(t *testing.T) {
mockInfraDependencies.AssertExpectations(t)
}

func TestFetchRacesByYearErrorHandling(t *testing.T) {

assert := assert.New(t)

mockInfraDependencies := new(MockInfraDependencies)
mockInfraDependencies.On(
"FetchRacesByYear",
2024,
).Return(
make([]domain_model.Race, 0),
errors.New("Unable to fetch races"),
)

_, error := GetRacesByYear(
2024,
mockInfraDependencies,
)

assert.NotEqual(error, nil)
assert.Equal(error.Error(), "Unable to fetch races")

mockInfraDependencies.AssertExpectations(t)
}

func TestFetchDriversByRaceErrorHandling(t *testing.T) {

assert := assert.New(t)

suzuka := test_domain_model.Suzuka()

mockInfraDependencies := new(MockInfraDependencies)
mockInfraDependencies.On(
"FetchRacesByYear",
2024,
).Return(
suzuka,
nil,
)
mockInfraDependencies.On(
"FetchDriversByRace",
suzuka[0].Id,
).Return(
make([]domain_model.Driver, 0),
errors.New("Unable to fetch drivers"),
)

_, error := GetRacesByYear(
2024,
mockInfraDependencies,
)

assert.NotEqual(error, nil)
assert.Equal(error.Error(), "Unable to fetch drivers")

mockInfraDependencies.AssertExpectations(t)
}

func TestFetchPodiumByRaceErrorHandling(t *testing.T) {

assert := assert.New(t)

suzuka := test_domain_model.Suzuka()

mockInfraDependencies := new(MockInfraDependencies)
mockInfraDependencies.On(
"FetchRacesByYear",
2024,
).Return(
suzuka,
nil,
)
mockInfraDependencies.On(
"FetchDriversByRace",
suzuka[0].Id,
).Return(
make([]domain_model.Driver, 0),
nil,
)
mockInfraDependencies.On(
"FetchPodiumByRace",
suzuka[0].Id,
[]domain_model.Driver{},
).Return(
[3]domain_model.Podium{},
errors.New("Unable to fetch podiums"),
)

_, error := GetRacesByYear(
2024,
mockInfraDependencies,
)

assert.NotEqual(error, nil)
assert.Equal(error.Error(), "Unable to fetch podiums")

mockInfraDependencies.AssertExpectations(t)
}

type MockInfraDependencies struct {
mock.Mock
}
Expand Down
Loading