Skip to content
22 changes: 22 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: cd

on:
push:
branches: [main]

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22.0"

- name: Build App
run: ./scripts/buildprod.sh
52 changes: 52 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: ci

on:
pull_request:
branches: [main]

jobs:
tests:
name: Tests
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22.0"

- name: Force Failure
run: go test ./... -cover
continue-on-error: true

- name: Install gosec
run: go install github.com/securego/gosec/v2/cmd/gosec@latest

- name: Run gosec
run: gosec ./...


style:
name: Style
runs-on: ubuntu-latest

steps:
- name: Check out code formatting
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22.0"

- name: Check formatting
run: test -z $(go fmt ./...)

- name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@latest

- name: Run staticcheck
run: staticcheck ./...
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
![badge of hope](https://github.com/tadoodles/learn-cicd-starter/actions/workflows/ci.yml/badge.svg)

# learn-cicd-starter (Notely)

This repo contains the starter code for the "Notely" application for the "Learn CICD" course on [Boot.dev](https://boot.dev).
Expand All @@ -21,3 +23,5 @@ go build -o notely && ./notely
*This starts the server in non-database mode.* It will serve a simple webpage at `http://localhost:8080`.

You do *not* need to set up a database or any interactivity on the webpage yet. Instructions for that will come later in the course!

"tadoodles's version of Boot.dev's Notely app."
57 changes: 57 additions & 0 deletions internal/auth/auth_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package auth

import (
"errors"
"net/http"
"testing"
)

type apiKeyResult struct {
ApiKey string
err error
}

func TestGetAPIKey(t *testing.T) {
tests := map[string]struct {
input http.Header
want apiKeyResult
}{
"Simple": {
input: func() http.Header {
h := http.Header{}
h.Add("Authorization", "ApiKey test-key")
return h
}(),
want: apiKeyResult{"test-key", nil}},
"NoAuthHeader": {
input: func() http.Header {
h := http.Header{}
return h
}(),
want: apiKeyResult{"", ErrNoAuthHeaderIncluded}},
"MalformedAuthHeader": {
input: func() http.Header {
h := http.Header{}
h.Add("Authorization", "Badformay")
return h
}(),
want: apiKeyResult{"", errors.New("malformed authorization header")}},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
got, err := GetAPIKey(tc.input)
if got != tc.want.ApiKey {
t.Errorf("expected API key: %v, got: %v", tc.want.ApiKey, got)
}
if err == nil && tc.want.err == nil {
// both nil, that's good
} else if err == nil || tc.want.err == nil {
t.Errorf("expected error: %v, got: %v", tc.want.err, err)
} else if err.Error() != tc.want.err.Error() {
t.Errorf("expected error: %v, got: %v", tc.want.err, err)
}
})
}

}
4 changes: 3 additions & 1 deletion json.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,7 @@ func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
return
}
w.WriteHeader(code)
w.Write(dat)
if _, err := w.Write(dat); err != nil {
log.Printf("Error writing response: %v", err)
}
}
6 changes: 4 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"log"
"net/http"
"os"
"time"

"github.com/go-chi/chi"
"github.com/go-chi/cors"
Expand Down Expand Up @@ -89,8 +90,9 @@ func main() {

router.Mount("/v1", v1Router)
srv := &http.Server{
Addr: ":" + port,
Handler: router,
Addr: ":" + port,
Handler: router,
ReadHeaderTimeout: 10 * time.Second,
}

log.Printf("Serving on port: %s\n", port)
Expand Down