Skip to content

Commit

Permalink
fix all broken code and imports and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nullbio committed May 27, 2017
1 parent 2d14f84 commit 7594e4b
Show file tree
Hide file tree
Showing 14 changed files with 247 additions and 91 deletions.
3 changes: 3 additions & 0 deletions abcconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,9 @@ func UnmarshalAppConfig(cfg interface{}, v *viper.Viper) error {

v.Unmarshal(&appCfg)
val.Field(i).Set(reflect.ValueOf(appCfg))
// overwrite val to point to the AppConfig so DBConfig can be set below.
val = val.Field(i)
break
}

// Find *DBConfig and set object appropriately
Expand Down
119 changes: 117 additions & 2 deletions abcconfig/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,104 @@ type MyThing struct {
Angry string `toml:"angry" mapstructure:"angry" env:"CUSTOM_THING_ANGRY"`
}

type RealConfig struct {
AppConfig
}

func TestBindLoadEnv(t *testing.T) {
// replicate real config file
contents := []byte(`
[dev]
[dev.server]
bind = ":4000"
tls-cert-file = "cert.pem"
tls-key-file = "private.key"
live-reload = true
prod-logger = false
assets-manifest = false
assets-no-cache = true
render-recompile = true
sessions-dev-storer = true
[dev.db]
db = "postgres"
user = "username"
pass = "password"
dbname = "lolwtf_dev"
host = "localhost"
sslmode = "require"
enforce-migration = false
blacklist = ["mig_migrations"]
[prod]
[prod.server]
bind = ":80"
tls-bind = ":443"
tls-cert-file = "cert.pem"
tls-key-file = "private.key"
[prod.db]
pass = "password"
dbname = "lolwtf_prod"
host = "localhost"
sslmode = "require"
blacklist = ["mig_migrations"]
[test]
[test.db]
db = "postgres"
user = "cooluser"
pass = "coolpass"
dbname = "lolwtf_test"
host = "localhost"
sslmode = "require"
`)

file, err := ioutil.TempFile("", "abcconfig")
if err != nil {
t.Fatal(err)
}
defer func() {
n := file.Name()
file.Close()
os.Remove(n)
}()

if _, err := file.Write(contents); err != nil {
t.Fatal(err)
}

c := &Config{
File: file.Name(),
LoadEnv: "test",
}

cfg := &RealConfig{}
flags := NewFlagSet()

if _, err := c.Bind(flags, cfg); err != nil {
t.Error(err)
}

if cfg.DB.DB != "postgres" {
t.Errorf("expected postgres, got %s", cfg.DB.DB)
}
if cfg.DB.DBName != "lolwtf_test" {
t.Errorf("expected lolwtf_test, got %s", cfg.DB.DBName)
}
if cfg.DB.User != "cooluser" {
t.Errorf("expected cooluser, got %s", cfg.DB.User)
}
if cfg.DB.Pass != "coolpass" {
t.Errorf("expected coolpass, got %s", cfg.DB.Pass)
}
if cfg.DB.Host != "localhost" {
t.Errorf("expected localhost, got %s", cfg.DB.Host)
}
if cfg.DB.SSLMode != "require" {
t.Errorf("expected require, got %s", cfg.DB.SSLMode)
}
if cfg.DB.Port != 5432 {
t.Errorf("expected 5432, got %d", cfg.DB.Port)
}
}

func TestBind(t *testing.T) {
contents := []byte(`
[prod]
Expand Down Expand Up @@ -98,7 +196,11 @@ func TestBind(t *testing.T) {
if err != nil {
t.Fatal(err)
}
defer file.Close()
defer func() {
n := file.Name()
file.Close()
os.Remove(n)
}()

if _, err := file.Write(contents); err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -161,6 +263,12 @@ func TestBind(t *testing.T) {
if cfg.Env != "cool" {
t.Errorf("expected env to be cool, got %s", cfg.Env)
}
if cfg.DB.DB != "postgres" {
t.Errorf("expected postgres, got %s", cfg.DB.DB)
}
if cfg.DB.Port != 5432 {
t.Errorf("expected port 5432, got %d", cfg.DB.Port)
}

cfg = &AppConfig{}
flags = NewFlagSet()
Expand Down Expand Up @@ -386,7 +494,11 @@ func TestCustomCommandExample(t *testing.T) {
if err != nil {
t.Fatal(err)
}
defer file.Close()
defer func() {
n := file.Name()
file.Close()
os.Remove(n)
}()

if _, err := file.Write(contents); err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -437,4 +549,7 @@ func TestCustomCommandExample(t *testing.T) {
if cfg.DB.DBName != "c" {
t.Errorf("expected db.dbname c, got %s", cfg.DB.DBName)
}
if cfg.DB.Port != 5432 {
t.Errorf("expected db.port 5432, got %d", cfg.DB.Port)
}
}
9 changes: 8 additions & 1 deletion abcmiddleware/middleware.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package abcmiddleware

import "go.uber.org/zap"
import (
"net/http"

"go.uber.org/zap"
)

// CtxLoggerKey is the http.Request Context lookup key for the request ID logger
const CtxLoggerKey = "request_id_logger"

// MiddlewareFunc is the function signature for Chi's Use() middleware
type MiddlewareFunc func(http.Handler) http.Handler

// Middleware exposes useful variables to every abcmiddleware handler
type Middleware struct {
// Log is used for logging in your middleware and to
Expand Down
6 changes: 3 additions & 3 deletions abcrender/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type Renderer interface {
// It's also required to wrap the AssetsManifest for the template function helpers.
type Render struct {
*render.Render
AssetsManifest map[string]string
assetsManifest map[string]string
}

// HTML renders a HTML template by calling unrolled Render package's HTML function
Expand All @@ -55,10 +55,10 @@ func (r *Render) HTMLWithLayout(w io.Writer, status int, name string, binding in
}

// New returns a new Render with AssetsManifest and Render set
func New(opts render.Options, manifest map[string]string) *Render {
func New(opts render.Options, manifest map[string]string) Renderer {
return &Render{
Render: render.New(opts),
AssetsManifest: manifest,
assetsManifest: manifest,
}
}

Expand Down
2 changes: 1 addition & 1 deletion abcrender/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func TestNew(t *testing.T) {
t.Error("did not expect nil")
}

if o.AssetsManifest["test"] != "test" {
if o.(*Render).assetsManifest["test"] != "test" {
t.Error("expected test key to have value test")
}
}
Expand Down
1 change: 0 additions & 1 deletion templates/.abcweb.toml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ no-tls-certs = {{.NoTLSCerts}}
no-readme = {{.NoReadme}}
no-config = {{.NoConfig}}
no-sessions = {{.NoSessions}}
no-request-id = {{.NoRequestID}}
force-overwrite = {{.ForceOverwrite}}
no-http-redirect = {{.NoHTTPRedirect}}
skip-npm-install = {{.SkipNPMInstall}}
Expand Down
37 changes: 18 additions & 19 deletions templates/app/setup.go.tmpl
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package app

import (
"github.com/volatiletech/abcweb/abcconfig"
{{if not .NoSessions -}}
"github.com/volatiletech/abcsessions"
"github.com/volatiletech/abcweb/abcsessions"
{{- end}}
"github.com/volatiletech/abcmiddleware"
"github.com/volatiletech/abcrender"
"github.com/volatiletech/abcweb/abcconfig"
"github.com/volatiletech/abcweb/abcmiddleware"
"github.com/volatiletech/abcweb/abcrender"
"github.com/pressly/chi"
"github.com/spf13/cobra"
"go.uber.org/zap"
Expand Down Expand Up @@ -52,13 +52,12 @@ type AppConfig struct {
// NewApp returns an initialized App object
func NewApp() *App {
return &App{
AppConfig: abcconfig.AppConfig{},
Config: &AppConfig{},
}
}

// NewLogger returns a new zap logger
func NewLogger(cfg *AppConfig) (*zap.Logger, error) {
var err error
var zapCfg zap.Config

// JSON logging for production. Should be coupled with a log analyzer
Expand All @@ -79,7 +78,7 @@ func NewLogger(cfg *AppConfig) (*zap.Logger, error) {

{{if not .NoSessions -}}
// NewSessions returns a new abcsessions overseer
func NewSessions(cfg *AppConfig) abcsessions.Overseer {
func NewSessions(cfg *AppConfig) (abcsessions.Overseer, error) {
// Configure cookie options
opts := abcsessions.NewCookieOptions()
// If not using HTTPS, disable cookie secure flag
Expand All @@ -94,21 +93,21 @@ func NewSessions(cfg *AppConfig) abcsessions.Overseer {
{{- else if eq .DevStorer "memory" -}}
storer, err := abcsessions.NewDefaultMemoryStorer()
if err != nil {
panic(err)
return nil, err
}
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- else if eq .DevStorer "disk" -}}
storer, err := abcsessions.NewDefaultDiskStorer("{{randString 8}}")
if err != nil {
panic(err)
return nil, err
}
storer.StartCleaner()
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- else if eq .DevStorer "redis" -}}
// localhost:6379, no password, 0th indexed database.
storer, err := abcsessions.NewDefaultRedisStorer("", "", 0)
if err != nil {
panic(err)
return nil, err
}
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- end}}
Expand All @@ -118,41 +117,41 @@ func NewSessions(cfg *AppConfig) abcsessions.Overseer {
{{- else if eq .ProdStorer "memory" -}}
storer, err := abcsessions.NewDefaultMemoryStorer()
if err != nil {
panic(err)
return nil, err
}
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- else if eq .ProdStorer "disk" -}}
storer, err := abcsessions.NewDefaultDiskStorer("{{randString 8}}")
if err != nil {
panic(err)
return nil, err
}
storer.StartCleaner()
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- else if eq .ProdStorer "redis" -}}
// localhost:6379, no password, 0th indexed database.
storer, err := abcsessions.NewDefaultRedisStorer("", "", 0)
if err != nil {
panic(err)
return nil, err
}
overseer = abcsessions.NewStorageOverseer(opts, storer)
{{- end}}
}

return overseer
return overseer, nil
}
{{- end}}

// NewMiddlewares returns a list of middleware to be used by the router.
// See https://github.com/pressly/chi#middlewares and abcweb readme for extras.
func NewMiddlewares(cfg *AppConfig, log *zap.Logger) []http.Handler {
func NewMiddlewares(cfg *AppConfig, sessions abcsessions.Overseer, log *zap.Logger) []abcmiddleware.MiddlewareFunc {
m := abcmiddleware.Middleware{
Log: log,
}

middlewares := []http.Handler{}
middlewares := []abcmiddleware.MiddlewareFunc{}

// Display "abcweb dev" build errors in the browser.
if !s.AppConfig.Server.ProdLogger {
if !cfg.Server.ProdLogger {
middlewares = append(middlewares, web.ErrorChecker)
}

Expand All @@ -171,7 +170,7 @@ func NewMiddlewares(cfg *AppConfig, log *zap.Logger) []http.Handler {
middlewares = append(middlewares, m.Zap)

// Sets response headers to prevent clients from caching
if s.AppConfig.Server.AssetsNoCache {
if cfg.Server.AssetsNoCache {
middlewares = append(middlewares, chimiddleware.NoCache)
}

Expand All @@ -185,7 +184,7 @@ func NewMiddlewares(cfg *AppConfig, log *zap.Logger) []http.Handler {
// Note: This (or abcsessions.Middleware instead) is a mandatory middleware
// when using the abcsessions library. If you do not want the refresh
// component you can replace this call with abcsessions.Middleware.
middlewares = append(middlewares, s.Session.MiddlewareWithReset)
middlewares = append(middlewares, sessions.MiddlewareWithReset)
{{- end}}

return middlewares
Expand Down
14 changes: 8 additions & 6 deletions templates/commands.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import (
"os"

"github.com/volatiletech/abcweb/abcconfig"
"github.com/volatiletech/abcweb/abcserver"
"github.com/volatiletech/abcweb/abcconfig"
"github.com/volatiletech/abcweb/abcdatabase"
"{{.ImportPath}}/app"
"{{.ImportPath}}/db"
"github.com/pkg/errors"
"github.com/volatiletech/mig"
"{{.ImportPath}}/rendering"
"github.com/pressly/chi"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -41,7 +41,9 @@ func migrateSetup(a *app.App) {
Use: "migrate",
Short: "Run your database migrations",
RunE: func(cmd *cobra.Command, args []string) error {
v, err := abcconfig.Bind(cmd.Flags(), a.Config)
c := abcconfig.NewConfig("")

v, err := c.Bind(cmd.Flags(), a.Config)
if err != nil {
return errors.Wrap(err, "cannot bind app config")
}
Expand All @@ -50,12 +52,12 @@ func migrateSetup(a *app.App) {
return errors.Wrap(err, "could not find migrations folder")
}

connStr, err := db.GetConnStr(a.Config.DB)
connStr, err := abcdatabase.GetConnStr(a.Config.DB)
if err != nil {
return errors.Wrap(err, "could not create connection string")
}

if v.Get("down") {
if v.GetBool("down") {
name, err := mig.Down(a.Config.DB.DB, connStr, filepath.Join("db", "migrations"))
if err != nil {
return errors.Wrap(err, "call to mig down failed")
Expand Down
Loading

0 comments on commit 7594e4b

Please sign in to comment.