Compare commits

..

2 Commits

Author SHA1 Message Date
clawbot
4f687aab4d fix: use $.CSRFField in dashboard template range loop (closes #146)
Inside the {{range .AppStats}} block, the dot context is *AppStats,
not the root template data. Use $ to access the root-level CSRFField
added by addGlobals.
2026-02-26 02:55:53 -08:00
clawbot
4b9c99b267 test: add failing test for CSRFField in dashboard template with apps
The dashboard template accesses .CSRFField inside a range loop over
AppStats items, but AppStats doesn't have a CSRFField. This test
creates an app so the range loop executes, reproducing the bug from
issue #146.
2026-02-26 02:55:37 -08:00
48 changed files with 147 additions and 147 deletions

View File

@@ -4,20 +4,20 @@ package main
import ( import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
"sneak.berlin/go/upaas/internal/healthcheck" "git.eeqj.de/sneak/upaas/internal/healthcheck"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/middleware" "git.eeqj.de/sneak/upaas/internal/middleware"
"sneak.berlin/go/upaas/internal/server" "git.eeqj.de/sneak/upaas/internal/server"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
"sneak.berlin/go/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/auth"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
"sneak.berlin/go/upaas/internal/service/notify" "git.eeqj.de/sneak/upaas/internal/service/notify"
"sneak.berlin/go/upaas/internal/service/webhook" "git.eeqj.de/sneak/upaas/internal/service/webhook"
_ "github.com/joho/godotenv/autoload" _ "github.com/joho/godotenv/autoload"
) )

4
go.mod
View File

@@ -1,4 +1,4 @@
module sneak.berlin/go/upaas module git.eeqj.de/sneak/upaas
go 1.25 go 1.25
@@ -19,7 +19,6 @@ require (
github.com/stretchr/testify v1.11.1 github.com/stretchr/testify v1.11.1
go.uber.org/fx v1.24.0 go.uber.org/fx v1.24.0
golang.org/x/crypto v0.46.0 golang.org/x/crypto v0.46.0
golang.org/x/time v0.12.0
) )
require ( require (
@@ -75,6 +74,7 @@ require (
go.yaml.in/yaml/v3 v3.0.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/sys v0.39.0 // indirect golang.org/x/sys v0.39.0 // indirect
golang.org/x/text v0.32.0 // indirect golang.org/x/text v0.32.0 // indirect
golang.org/x/time v0.12.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.2 // indirect gotest.tools/v3 v3.5.2 // indirect

View File

@@ -13,8 +13,8 @@ import (
"github.com/spf13/viper" "github.com/spf13/viper"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
) )
// defaultPort is the default HTTP server port. // defaultPort is the default HTTP server port.

View File

@@ -14,8 +14,8 @@ import (
_ "github.com/mattn/go-sqlite3" // SQLite driver _ "github.com/mattn/go-sqlite3" // SQLite driver
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
) )
// dataDirPermissions is the file permission for the data directory. // dataDirPermissions is the file permission for the data directory.

View File

@@ -5,7 +5,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
func TestHashWebhookSecret(t *testing.T) { func TestHashWebhookSecret(t *testing.T) {

View File

@@ -5,8 +5,8 @@ import (
"os" "os"
"testing" "testing"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
) )
// NewTestDatabase creates an in-memory Database for testing. // NewTestDatabase creates an in-memory Database for testing.

View File

@@ -25,9 +25,9 @@ import (
"github.com/docker/go-connections/nat" "github.com/docker/go-connections/nat"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
) )
// sshKeyPermissions is the file permission for SSH private keys. // sshKeyPermissions is the file permission for SSH private keys.

View File

@@ -7,7 +7,7 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
// apiAppResponse is the JSON representation of an app. // apiAppResponse is the JSON representation of an app.

View File

@@ -11,7 +11,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
) )
// apiRouter builds a chi router with the API routes using session auth middleware. // apiRouter builds a chi router with the API routes using session auth middleware.

View File

@@ -15,9 +15,9 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
"sneak.berlin/go/upaas/templates" "git.eeqj.de/sneak/upaas/templates"
) )
const ( const (

View File

@@ -3,7 +3,7 @@ package handlers
import ( import (
"net/http" "net/http"
"sneak.berlin/go/upaas/templates" "git.eeqj.de/sneak/upaas/templates"
) )
// HandleLoginGET returns the login page handler. // HandleLoginGET returns the login page handler.

View File

@@ -4,8 +4,8 @@ import (
"net/http" "net/http"
"time" "time"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/templates" "git.eeqj.de/sneak/upaas/templates"
) )
// AppStats holds deployment statistics for an app. // AppStats holds deployment statistics for an app.

View File

@@ -10,16 +10,16 @@ import (
"github.com/gorilla/csrf" "github.com/gorilla/csrf"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/healthcheck" "git.eeqj.de/sneak/upaas/internal/healthcheck"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
"sneak.berlin/go/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/auth"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
"sneak.berlin/go/upaas/internal/service/webhook" "git.eeqj.de/sneak/upaas/internal/service/webhook"
"sneak.berlin/go/upaas/templates" "git.eeqj.de/sneak/upaas/templates"
) )
// Params contains dependencies for Handlers. // Params contains dependencies for Handlers.

View File

@@ -15,21 +15,21 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
"sneak.berlin/go/upaas/internal/healthcheck" "git.eeqj.de/sneak/upaas/internal/healthcheck"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/middleware" "git.eeqj.de/sneak/upaas/internal/middleware"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
"sneak.berlin/go/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/auth"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
"sneak.berlin/go/upaas/internal/service/notify" "git.eeqj.de/sneak/upaas/internal/service/notify"
"sneak.berlin/go/upaas/internal/service/webhook" "git.eeqj.de/sneak/upaas/internal/service/webhook"
) )
type testContext struct { type testContext struct {
@@ -405,12 +405,13 @@ func TestHandleDashboard(t *testing.T) {
assert.Contains(t, recorder.Body.String(), "Applications") assert.Contains(t, recorder.Body.String(), "Applications")
}) })
t.Run("renders dashboard with apps without crashing on CSRFField", func(t *testing.T) { t.Run("renders dashboard with apps without CSRFField error", func(t *testing.T) {
t.Parallel() t.Parallel()
testCtx := setupTestHandlers(t) testCtx := setupTestHandlers(t)
// Create an app so the template iterates over AppStats and hits .CSRFField // Create an app so the range loop in dashboard.html executes,
// which triggers .CSRFField access on each AppStats item.
createTestApp(t, testCtx, "csrf-test-app") createTestApp(t, testCtx, "csrf-test-app")
request := httptest.NewRequest(http.MethodGet, "/", nil) request := httptest.NewRequest(http.MethodGet, "/", nil)
@@ -419,8 +420,7 @@ func TestHandleDashboard(t *testing.T) {
handler := testCtx.handlers.HandleDashboard() handler := testCtx.handlers.HandleDashboard()
handler.ServeHTTP(recorder, request) handler.ServeHTTP(recorder, request)
assert.Equal(t, http.StatusOK, recorder.Code, assert.Equal(t, http.StatusOK, recorder.Code, "dashboard should render without template error")
"dashboard should not 500 when apps exist (CSRFField must be accessible)")
assert.Contains(t, recorder.Body.String(), "csrf-test-app") assert.Contains(t, recorder.Body.String(), "csrf-test-app")
}) })
} }

View File

@@ -3,7 +3,7 @@ package handlers_test
import ( import (
"testing" "testing"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
) )
func TestValidateRepoURL(t *testing.T) { func TestValidateRepoURL(t *testing.T) {

View File

@@ -3,7 +3,7 @@ package handlers_test
import ( import (
"testing" "testing"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
) )
func TestSanitizeLogs(t *testing.T) { //nolint:funlen // table-driven tests func TestSanitizeLogs(t *testing.T) { //nolint:funlen // table-driven tests

View File

@@ -3,7 +3,7 @@ package handlers
import ( import (
"net/http" "net/http"
"sneak.berlin/go/upaas/templates" "git.eeqj.de/sneak/upaas/templates"
) )
const ( const (

View File

@@ -3,7 +3,7 @@ package handlers_test
import ( import (
"testing" "testing"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
) )
func TestSanitizeTail(t *testing.T) { func TestSanitizeTail(t *testing.T) {

View File

@@ -6,7 +6,7 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
// maxWebhookBodySize is the maximum allowed size of a webhook request body (1MB). // maxWebhookBodySize is the maximum allowed size of a webhook request body (1MB).

View File

@@ -8,10 +8,10 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
) )
// Params contains dependencies for Healthcheck. // Params contains dependencies for Healthcheck.

View File

@@ -7,7 +7,7 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
) )
// Params contains dependencies for Logger. // Params contains dependencies for Logger.

View File

@@ -8,7 +8,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
) )
//nolint:gosec // test credentials //nolint:gosec // test credentials

View File

@@ -18,10 +18,10 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"golang.org/x/time/rate" "golang.org/x/time/rate"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/auth"
) )
// corsMaxAge is the maximum age for CORS preflight responses in seconds. // corsMaxAge is the maximum age for CORS preflight responses in seconds.

View File

@@ -9,7 +9,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
) )
func newTestMiddleware(t *testing.T) *Middleware { func newTestMiddleware(t *testing.T) *Middleware {

View File

@@ -7,7 +7,7 @@ import (
"fmt" "fmt"
"time" "time"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// appColumns is the standard column list for app queries. // appColumns is the standard column list for app queries.

View File

@@ -8,7 +8,7 @@ import (
"strings" "strings"
"time" "time"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// DeploymentStatus represents the status of a deployment. // DeploymentStatus represents the status of a deployment.

View File

@@ -7,7 +7,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// EnvVar represents an environment variable for an app. // EnvVar represents an environment variable for an app.

View File

@@ -7,7 +7,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// Label represents a Docker label for an app container. // Label represents a Docker label for an app container.

View File

@@ -10,11 +10,11 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
// Test constants to satisfy goconst linter. // Test constants to satisfy goconst linter.

View File

@@ -6,7 +6,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// PortProtocol represents the protocol for a port mapping. // PortProtocol represents the protocol for a port mapping.

View File

@@ -8,7 +8,7 @@ import (
"fmt" "fmt"
"time" "time"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// User represents a user in the system. // User represents a user in the system.

View File

@@ -6,7 +6,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// Volume represents a volume mount for an app container. // Volume represents a volume mount for an app container.

View File

@@ -7,7 +7,7 @@ import (
"fmt" "fmt"
"time" "time"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
) )
// WebhookEvent represents a received webhook event. // WebhookEvent represents a received webhook event.

View File

@@ -8,7 +8,7 @@ import (
chimw "github.com/go-chi/chi/v5/middleware" chimw "github.com/go-chi/chi/v5/middleware"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
"sneak.berlin/go/upaas/static" "git.eeqj.de/sneak/upaas/static"
) )
// requestTimeout is the maximum duration for handling a request. // requestTimeout is the maximum duration for handling a request.

View File

@@ -12,11 +12,11 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/handlers" "git.eeqj.de/sneak/upaas/internal/handlers"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/middleware" "git.eeqj.de/sneak/upaas/internal/middleware"
) )
// Params contains dependencies for Server. // Params contains dependencies for Server.

View File

@@ -14,10 +14,10 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/ssh" "git.eeqj.de/sneak/upaas/internal/ssh"
) )
// ServiceParams contains dependencies for Service. // ServiceParams contains dependencies for Service.

View File

@@ -8,12 +8,12 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/app"
) )
func setupTestService(t *testing.T) (*app.Service, func()) { func setupTestService(t *testing.T) (*app.Service, func()) {

View File

@@ -15,10 +15,10 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"golang.org/x/crypto/argon2" "golang.org/x/crypto/argon2"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
const ( const (

View File

@@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/auth"
) )
func setupTestService(t *testing.T) (*auth.Service, func()) { func setupTestService(t *testing.T) (*auth.Service, func()) {

View File

@@ -17,12 +17,12 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/notify" "git.eeqj.de/sneak/upaas/internal/service/notify"
) )
// Time constants. // Time constants.

View File

@@ -9,7 +9,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
) )
func TestCancelActiveDeploy_NoExisting(t *testing.T) { func TestCancelActiveDeploy_NoExisting(t *testing.T) {

View File

@@ -10,8 +10,8 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
) )
func TestCleanupCancelledDeploy_RemovesBuildDir(t *testing.T) { func TestCleanupCancelledDeploy_RemovesBuildDir(t *testing.T) {

View File

@@ -6,10 +6,10 @@ import (
"os" "os"
"testing" "testing"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
) )
func TestBuildContainerOptionsUsesImageID(t *testing.T) { func TestBuildContainerOptionsUsesImageID(t *testing.T) {

View File

@@ -8,9 +8,9 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
// NewTestService creates a Service with minimal dependencies for testing. // NewTestService creates a Service with minimal dependencies for testing.

View File

@@ -15,8 +15,8 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
) )
// HTTP client timeout. // HTTP client timeout.

View File

@@ -10,11 +10,11 @@ import (
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
) )
// ServiceParams contains dependencies for Service. // ServiceParams contains dependencies for Service.

View File

@@ -12,15 +12,15 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/fx" "go.uber.org/fx"
"sneak.berlin/go/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/config"
"sneak.berlin/go/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/database"
"sneak.berlin/go/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/docker"
"sneak.berlin/go/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/globals"
"sneak.berlin/go/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/logger"
"sneak.berlin/go/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/models"
"sneak.berlin/go/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/deploy"
"sneak.berlin/go/upaas/internal/service/notify" "git.eeqj.de/sneak/upaas/internal/service/notify"
"sneak.berlin/go/upaas/internal/service/webhook" "git.eeqj.de/sneak/upaas/internal/service/webhook"
) )
type testDeps struct { type testDeps struct {

View File

@@ -4,9 +4,9 @@ import (
"strings" "strings"
"testing" "testing"
"git.eeqj.de/sneak/upaas/internal/ssh"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"sneak.berlin/go/upaas/internal/ssh"
) )
func TestGenerateKeyPair(t *testing.T) { func TestGenerateKeyPair(t *testing.T) {