mirror of
https://github.com/nicksherron/bashhub-server.git
synced 2025-09-03 19:04:11 +08:00
added server_test helpers
This commit is contained in:
parent
14bae98d19
commit
629475e08f
13 changed files with 491 additions and 576 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -2,6 +2,4 @@ bin
|
|||
vendor
|
||||
dist
|
||||
dist.bk
|
||||
internal/test_data
|
||||
scripts/local
|
||||
test/testdata
|
||||
scripts/local
|
|
@ -7,4 +7,4 @@ env:
|
|||
|
||||
install: true
|
||||
|
||||
script: go test ./...
|
||||
script: go test github.com/nicksherron/bashhub-server/internal
|
13
Makefile
13
Makefile
|
@ -61,18 +61,9 @@ clean:
|
|||
@test ! -e bin/${BIN_NAME} || rm bin/${BIN_NAME}
|
||||
|
||||
test:
|
||||
go test -v ./...
|
||||
|
||||
docker-postgres-stop:
|
||||
docker stop bashhub-postgres-test
|
||||
|
||||
docker-postgres-start:
|
||||
docker run -d --rm --name bashhub-postgres-test -p 5444:5432 postgres
|
||||
go test github.com/nicksherron/bashhub-server/internal
|
||||
|
||||
test-postgres:
|
||||
go test -v ./... -postgres -postgres-uri "postgres://postgres:@localhost:5444?sslmode=disable"
|
||||
|
||||
test-docker-postgres: docker-postgres-stop docker-postgres-start test-postgres
|
||||
|
||||
scripts/test_postgres.sh
|
||||
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ Available Commands:
|
|||
|
||||
Flags:
|
||||
-a, --addr string Ip and port to listen and serve on. (default "http://0.0.0.0:8080")
|
||||
--db string DB location (sqlite or postgres)
|
||||
--db string db location (sqlite or postgres)
|
||||
-h, --help help for this command
|
||||
--log string Set filepath for HTTP log. "" logs to stderr.
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ func Execute() {
|
|||
func init() {
|
||||
cobra.OnInitialize()
|
||||
rootCmd.PersistentFlags().StringVar(&internal.LogFile, "log", "", `Set filepath for HTTP log. "" logs to stderr`)
|
||||
rootCmd.PersistentFlags().StringVar(&internal.DbPath, "db", dbPath(), "DB location (sqlite or postgres)")
|
||||
rootCmd.PersistentFlags().StringVar(&internal.DbPath, "db", sqlitePath(), "db location (sqlite or postgres)")
|
||||
rootCmd.PersistentFlags().StringVarP(&internal.Addr, "addr", "a", listenAddr(), "Ip and port to listen and serve on")
|
||||
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ func listenAddr() string {
|
|||
|
||||
}
|
||||
|
||||
func dbPath() string {
|
||||
func sqlitePath() string {
|
||||
dbFile := "data.db"
|
||||
f := filepath.Join(appDir(), dbFile)
|
||||
return f
|
||||
|
|
13
go.mod
13
go.mod
|
@ -1,20 +1,17 @@
|
|||
module github.com/nicksherron/bashhub-server
|
||||
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/appleboy/gin-jwt/v2 v2.6.3
|
||||
github.com/appleboy/gofight/v2 v2.1.2
|
||||
github.com/cheggaaa/pb/v3 v3.0.4
|
||||
github.com/fatih/color v1.9.0
|
||||
github.com/gin-gonic/gin v1.5.0
|
||||
github.com/google/uuid v1.1.1
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jinzhu/gorm v1.9.12
|
||||
github.com/lib/pq v1.3.0
|
||||
github.com/mattn/go-sqlite3 v2.0.1+incompatible
|
||||
github.com/spf13/cobra v0.0.3
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
||||
github.com/spf13/cobra v0.0.5
|
||||
github.com/stretchr/testify v1.4.0
|
||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd
|
||||
golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6
|
||||
)
|
||||
|
||||
go 1.13
|
||||
|
|
61
go.sum
61
go.sum
|
@ -1,23 +1,29 @@
|
|||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM=
|
||||
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
|
||||
github.com/appleboy/gin-jwt v2.5.0+incompatible h1:oLQTP1fiGDoDKoC2UDqXD9iqCP44ABIZMMenfH/xCqw=
|
||||
github.com/appleboy/gin-jwt/v2 v2.6.3 h1:aK4E3DjihWEBUTjEeRnGkA5nUkmwJPL1CPonMa2usRs=
|
||||
github.com/appleboy/gin-jwt/v2 v2.6.3/go.mod h1:MfPYA4ogzvOcVkRwAxT7quHOtQmVKDpTwxyUrC2DNw0=
|
||||
github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4=
|
||||
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/cheggaaa/pb v2.0.7+incompatible h1:gLKifR1UkZ/kLkda5gC0K6c8g+jU2sINPtBeOiNlMhU=
|
||||
github.com/cheggaaa/pb/v3 v3.0.4 h1:QZEPYOj2ix6d5oEg63fbHmpolrnNiwjUsk+h74Yt4bM=
|
||||
github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
|
||||
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
|
||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
|
||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
|
@ -28,9 +34,7 @@ github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotf
|
|||
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
|
||||
github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM=
|
||||
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
|
||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
|
@ -39,93 +43,92 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
|
|||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q=
|
||||
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M=
|
||||
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8=
|
||||
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
|
||||
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
|
||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
|
||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||
github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
|
||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw=
|
||||
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/tidwall/gjson v1.3.5 h1:2oW9FBNu8qt9jy5URgrzsVx/T/KSn3qn/smJQ0crlDQ=
|
||||
github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
|
||||
github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
|
||||
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
|
||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
|
||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg=
|
||||
golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU=
|
||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
|
||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
||||
gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
|
||||
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
|
||||
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
|
|
@ -38,8 +38,7 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
//DB is a connection pool to sqlite or postgres
|
||||
DB *sql.DB
|
||||
db *sql.DB
|
||||
// DbPath is the postgres connection uri or the sqlite db file location to use for backend.
|
||||
DbPath string
|
||||
connectionLimit int
|
||||
|
@ -53,7 +52,7 @@ func dbInit() {
|
|||
if strings.HasPrefix(DbPath, "postgres://") {
|
||||
// postgres
|
||||
|
||||
DB, err = sql.Open("postgres", DbPath)
|
||||
db, err = sql.Open("postgres", DbPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
@ -83,16 +82,16 @@ func dbInit() {
|
|||
})
|
||||
|
||||
DbPath = fmt.Sprintf("file:%v?cache=shared&mode=rwc&_loc=auto", DbPath)
|
||||
DB, err = sql.Open("sqlite3_with_regex", DbPath)
|
||||
db, err = sql.Open("sqlite3_with_regex", DbPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
DB.Exec("PRAGMA journal_mode=WAL;")
|
||||
db.Exec("PRAGMA journal_mode=WAL;")
|
||||
connectionLimit = 1
|
||||
|
||||
}
|
||||
DB.SetMaxOpenConns(connectionLimit)
|
||||
db.SetMaxOpenConns(connectionLimit)
|
||||
gormdb.AutoMigrate(&User{})
|
||||
gormdb.AutoMigrate(&Command{})
|
||||
gormdb.AutoMigrate(&System{})
|
||||
|
@ -113,19 +112,19 @@ func dbInit() {
|
|||
func (c Config) getSecret() string {
|
||||
var err error
|
||||
if connectionLimit != 1 {
|
||||
_, err = DB.Exec(`INSERT INTO configs ("id","created", "secret")
|
||||
_, err = db.Exec(`INSERT INTO configs ("id","created", "secret")
|
||||
VALUES (1, now(), (SELECT md5(random()::text)))
|
||||
ON conflict do nothing;`)
|
||||
|
||||
} else {
|
||||
_, err = DB.Exec(`INSERT INTO configs ("id","created" ,"secret")
|
||||
_, err = db.Exec(`INSERT INTO configs ("id","created" ,"secret")
|
||||
VALUES (1, current_timestamp, lower(hex(randomblob(16))))
|
||||
ON conflict do nothing;`)
|
||||
}
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
err = DB.QueryRow(`SELECT "secret" from configs where "id" = 1 `).Scan(&c.Secret)
|
||||
err = db.QueryRow(`SELECT "secret" from configs where "id" = 1 `).Scan(&c.Secret)
|
||||
return c.Secret
|
||||
}
|
||||
|
||||
|
@ -149,7 +148,7 @@ func comparePasswords(hashedPwd string, plainPwd string) bool {
|
|||
|
||||
func (user User) userExists() bool {
|
||||
var password string
|
||||
err := DB.QueryRow("SELECT password FROM users WHERE username = $1",
|
||||
err := db.QueryRow("SELECT password FROM users WHERE username = $1",
|
||||
user.Username).Scan(&password)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
log.Fatalf("error checking if row exists %v", err)
|
||||
|
@ -162,7 +161,7 @@ func (user User) userExists() bool {
|
|||
|
||||
func (user User) userGetID() uint {
|
||||
var id uint
|
||||
err := DB.QueryRow(`SELECT "id"
|
||||
err := db.QueryRow(`SELECT "id"
|
||||
FROM users
|
||||
WHERE "username" = $1`,
|
||||
user.Username).Scan(&id)
|
||||
|
@ -174,7 +173,7 @@ func (user User) userGetID() uint {
|
|||
|
||||
func (user User) userGetSystemName() string {
|
||||
var systemName string
|
||||
err := DB.QueryRow(`SELECT name
|
||||
err := db.QueryRow(`SELECT name
|
||||
FROM systems
|
||||
WHERE user_id in (select id from users where username = $1)
|
||||
AND mac = $2`,
|
||||
|
@ -187,7 +186,7 @@ func (user User) userGetSystemName() string {
|
|||
|
||||
func (user User) usernameExists() bool {
|
||||
var exists bool
|
||||
err := DB.QueryRow(`SELECT exists (select id FROM users WHERE "username" = $1)`,
|
||||
err := db.QueryRow(`SELECT exists (select id FROM users WHERE "username" = $1)`,
|
||||
user.Username).Scan(&exists)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
log.Fatalf("error checking if row exists %v", err)
|
||||
|
@ -197,7 +196,7 @@ func (user User) usernameExists() bool {
|
|||
|
||||
func (user User) emailExists() bool {
|
||||
var exists bool
|
||||
err := DB.QueryRow(`SELECT exists (select id FROM users WHERE "email" = $1)`,
|
||||
err := db.QueryRow(`SELECT exists (select id FROM users WHERE "email" = $1)`,
|
||||
user.Email).Scan(&exists)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
log.Fatalf("error checking if row exists %v", err)
|
||||
|
@ -207,7 +206,7 @@ func (user User) emailExists() bool {
|
|||
|
||||
func (user User) userCreate() int64 {
|
||||
user.Password = hashAndSalt(user.Password)
|
||||
res, err := DB.Exec(`INSERT INTO users("registration_code", "username","password","email")
|
||||
res, err := db.Exec(`INSERT INTO users("registration_code", "username","password","email")
|
||||
VALUES ($1,$2,$3,$4) ON CONFLICT(username) do nothing`, user.RegistrationCode,
|
||||
user.Username, user.Password, user.Email)
|
||||
if err != nil {
|
||||
|
@ -222,7 +221,7 @@ func (user User) userCreate() int64 {
|
|||
|
||||
func (cmd Command) commandInsert() int64 {
|
||||
|
||||
res, err := DB.Exec(`
|
||||
res, err := db.Exec(`
|
||||
INSERT INTO commands("process_id","process_start_time","exit_status","uuid","command", "created", "path", "user_id", "system_name")
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) ON CONFLICT do nothing`,
|
||||
cmd.ProcessId, cmd.ProcessStartTime, cmd.ExitStatus, cmd.Uuid, cmd.Command, cmd.Created, cmd.Path, cmd.User.ID, cmd.SystemName)
|
||||
|
@ -254,7 +253,7 @@ func (cmd Command) commandGet() ([]Query, error) {
|
|||
AND "system_name" = '%v'
|
||||
AND "command" ~ '%v'
|
||||
) c
|
||||
ORDER BY "created" DESC limit '%v';`, cmd.User.ID, cmd.Path, cmd.SystemName, cmd.Query, cmd.Limit,)
|
||||
ORDER BY "created" DESC limit '%v';`, cmd.User.ID, cmd.Path, cmd.SystemName, cmd.Query, cmd.Limit)
|
||||
|
||||
} else if cmd.Path != "" && cmd.Query != "" && cmd.Unique {
|
||||
query = fmt.Sprintf(`
|
||||
|
@ -448,7 +447,7 @@ func (cmd Command) commandGet() ([]Query, error) {
|
|||
if QueryDebug {
|
||||
fmt.Println(query)
|
||||
}
|
||||
rows, err := DB.Query(query)
|
||||
rows, err := db.Query(query)
|
||||
|
||||
if err != nil {
|
||||
return []Query{}, err
|
||||
|
@ -468,7 +467,7 @@ func (cmd Command) commandGet() ([]Query, error) {
|
|||
|
||||
func (cmd Command) commandGetUUID() (Query, error) {
|
||||
var result Query
|
||||
err := DB.QueryRow(`
|
||||
err := db.QueryRow(`
|
||||
SELECT "command","path", "created" , "uuid", "exit_status", "system_name"
|
||||
FROM commands
|
||||
WHERE "uuid" = $1
|
||||
|
@ -481,7 +480,7 @@ func (cmd Command) commandGetUUID() (Query, error) {
|
|||
}
|
||||
|
||||
func (cmd Command) commandDelete() int64 {
|
||||
res, err := DB.Exec(`
|
||||
res, err := db.Exec(`
|
||||
DELETE FROM commands WHERE "user_id" = $1 AND "uuid" = $2 `, cmd.User.ID, cmd.Uuid)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
@ -497,7 +496,7 @@ func (cmd Command) commandDelete() int64 {
|
|||
func (sys System) systemUpdate() int64 {
|
||||
|
||||
t := time.Now().Unix()
|
||||
res, err := DB.Exec(`
|
||||
res, err := db.Exec(`
|
||||
UPDATE systems
|
||||
SET "hostname" = $1 , "updated" = $2
|
||||
WHERE "user_id" = $3
|
||||
|
@ -516,7 +515,7 @@ func (sys System) systemUpdate() int64 {
|
|||
func (sys System) systemInsert() int64 {
|
||||
|
||||
t := time.Now().Unix()
|
||||
res, err := DB.Exec(`INSERT INTO systems ("name", "mac", "user_id", "hostname", "client_version", "created", "updated")
|
||||
res, err := db.Exec(`INSERT INTO systems ("name", "mac", "user_id", "hostname", "client_version", "created", "updated")
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)`,
|
||||
sys.Name, sys.Mac, sys.User.ID, sys.Hostname, sys.ClientVersion, t, t)
|
||||
if err != nil {
|
||||
|
@ -531,7 +530,7 @@ func (sys System) systemInsert() int64 {
|
|||
|
||||
func (sys System) systemGet() (System, error) {
|
||||
var row System
|
||||
err := DB.QueryRow(`SELECT "name", "mac", "user_id", "hostname", "client_version",
|
||||
err := db.QueryRow(`SELECT "name", "mac", "user_id", "hostname", "client_version",
|
||||
"id", "created", "updated" FROM systems
|
||||
WHERE "user_id" = $1
|
||||
AND "mac" = $2`,
|
||||
|
@ -547,7 +546,7 @@ func (sys System) systemGet() (System, error) {
|
|||
func (status Status) statusGet() (Status, error) {
|
||||
var err error
|
||||
if connectionLimit != 1 {
|
||||
err = DB.QueryRow(`select
|
||||
err = db.QueryRow(`select
|
||||
( select count(*) from commands where user_id = $1) as totalCommands,
|
||||
( select count(distinct process_id) from commands where user_id = $1) as totalSessions,
|
||||
( select count(distinct system_name) from commands where user_id = $1) as totalSystems,
|
||||
|
@ -557,7 +556,7 @@ func (status Status) statusGet() (Status, error) {
|
|||
&status.TotalCommands, &status.TotalSessions, &status.TotalSystems,
|
||||
&status.TotalCommandsToday, &status.SessionTotalCommands)
|
||||
} else {
|
||||
err = DB.QueryRow(`select
|
||||
err = db.QueryRow(`select
|
||||
( select count(*) from commands where user_id = $1) as totalCommands,
|
||||
( select count(distinct process_id) from commands where user_id = $1) as totalSessions,
|
||||
( select count(distinct system_name) from commands where user_id = $1) as totalSystems,
|
||||
|
@ -574,7 +573,7 @@ func (status Status) statusGet() (Status, error) {
|
|||
}
|
||||
|
||||
func importCommands(imp Import) {
|
||||
_, err := DB.Exec(`INSERT INTO commands
|
||||
_, err := db.Exec(`INSERT INTO commands
|
||||
("command", "path", "created", "uuid", "exit_status",
|
||||
"system_name", "session_id", "user_id" )
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7,(select "id" from users where "username" = $8)) ON CONFLICT do nothing`,
|
||||
|
|
|
@ -130,10 +130,8 @@ func loggerWithFormatterWriter(f gin.LogFormatter) gin.HandlerFunc {
|
|||
}
|
||||
|
||||
// configure routes and middleware
|
||||
func SetupRouter() *gin.Engine {
|
||||
// Initialize backend
|
||||
func setupRouter() *gin.Engine {
|
||||
dbInit()
|
||||
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
r := gin.New()
|
||||
r.Use(gin.Recovery())
|
||||
|
@ -461,7 +459,7 @@ func SetupRouter() *gin.Engine {
|
|||
|
||||
// Run starts server
|
||||
func Run() {
|
||||
r := SetupRouter()
|
||||
r := setupRouter()
|
||||
|
||||
Addr = strings.ReplaceAll(Addr, "http://", "")
|
||||
err := r.Run(Addr)
|
||||
|
|
226
internal/server_test.go
Normal file
226
internal/server_test.go
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
*
|
||||
* Copyright © 2020 nicksherron <nsherron90@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package internal
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var (
|
||||
noCleanup = flag.Bool("no-cleanup", false, "don't remove testdata directory with sqlite db after test")
|
||||
postgres = flag.Bool("postgres", false, "run postgres tests")
|
||||
postgresUri = flag.String("postgres-uri", "postgres://postgres:@localhost:5444?sslmode=disable", "postgres uri to use for postgres tests")
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
flag.Parse()
|
||||
dirCleanup()
|
||||
defer func() {
|
||||
if !*noCleanup {
|
||||
dirCleanup()
|
||||
}
|
||||
}()
|
||||
|
||||
var err error
|
||||
dir, err = os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
testDir = os.TempDir()
|
||||
log.Println("test directory", testDir)
|
||||
DbPath = filepath.Join(testDir, "test.db")
|
||||
LogFile = filepath.Join(testDir, "server.log")
|
||||
log.Print("sqlite tests")
|
||||
router = setupRouter()
|
||||
m.Run()
|
||||
|
||||
if *postgres {
|
||||
log.Print("postgres tests")
|
||||
DbPath = *postgresUri
|
||||
router = setupRouter()
|
||||
m.Run()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestToken(t *testing.T) {
|
||||
createUser(t)
|
||||
sysRegistered = false
|
||||
jwtToken = getToken(t)
|
||||
|
||||
}
|
||||
|
||||
func TestCommandInsert(t *testing.T) {
|
||||
var commandTests = []Command{
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "cat foo.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "ls"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "pwd"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "whoami"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "which cat"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "head foo.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "sed 's/fooobaar/foobar/g' somefile.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "curl google.com"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "file /dev/null"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "df -h"},
|
||||
{ProcessId: 90226, ExitStatus: 127, Command: "catt"},
|
||||
{ProcessId: 90226, ExitStatus: 127, Command: "cay"},
|
||||
}
|
||||
|
||||
hourAgo := time.Now().UnixNano() - (1 * time.Hour).Nanoseconds()
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
for _, tc := range commandTests {
|
||||
uid, err := uuid.NewRandom()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tc.Path = dir
|
||||
tc.Created = time.Now().Unix()
|
||||
tc.ProcessStartTime = hourAgo
|
||||
tc.Uuid = uid.String()
|
||||
payloadBytes, err := json.Marshal(&tc)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := testRequest("POST", "/api/v1/command", body)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCommandQuery(t *testing.T) {
|
||||
type queryTest struct {
|
||||
query string
|
||||
expect int
|
||||
}
|
||||
var queryTests = []queryTest{
|
||||
{query: fmt.Sprintf("path=%v&unique=true&systemName=%v&query=^curl", url.QueryEscape(dir), system), expect: 1},
|
||||
{query: fmt.Sprintf("path=%v&query=^curl&unique=true", url.QueryEscape(dir)), expect: 1},
|
||||
{query: fmt.Sprintf("systemName=%v&query=^curl", system), expect: 5},
|
||||
{query: fmt.Sprintf("path=%v&query=^curl", url.QueryEscape(dir)), expect: 5},
|
||||
{query: fmt.Sprintf("systemName=%v&unique=true", system), expect: 10},
|
||||
{query: fmt.Sprintf("path=%v&unique=true", url.QueryEscape(dir)), expect: 10},
|
||||
{query: fmt.Sprintf("path=%v", url.QueryEscape(dir)), expect: 50},
|
||||
{query: fmt.Sprintf("systemName=%v", system), expect: 50},
|
||||
{query: "query=^curl&unique=true", expect: 1},
|
||||
{query: "query=^curl", expect: 5},
|
||||
{query: "unique=true", expect: 10},
|
||||
{query: "limit=1", expect: 1},
|
||||
}
|
||||
|
||||
for _, v := range queryTests {
|
||||
func() {
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.query)
|
||||
w := testRequest("GET", u, nil)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []Query
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if v.expect != len(data) {
|
||||
t.Fatalf("expected: %v, got: %v -- query: %v ", v.expect, len(data), v.query)
|
||||
}
|
||||
assert.Contains(t, system, data[0].SystemName)
|
||||
assert.Contains(t, dir, data[0].Path)
|
||||
}()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestCommandFindDelete(t *testing.T) {
|
||||
|
||||
var record Command
|
||||
|
||||
func() {
|
||||
v := url.Values{}
|
||||
v.Add("limit", "1")
|
||||
v.Add("unique", "true")
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
w := testRequest("GET", u, nil)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 1, len(data))
|
||||
record = data[0]
|
||||
}()
|
||||
func() {
|
||||
u := fmt.Sprintf("/api/v1/command/%v", record.Uuid)
|
||||
w := testRequest("GET", u, nil)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, record.Uuid, data.Uuid)
|
||||
}()
|
||||
|
||||
func() {
|
||||
u := fmt.Sprintf("/api/v1/command/%v", record.Uuid)
|
||||
w := testRequest("DELETE", u, nil)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}()
|
||||
func() {
|
||||
w := testRequest("GET", "/api/v1/command/search?", nil)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 49, len(data))
|
||||
}()
|
||||
|
||||
}
|
160
internal/server_test_helpers.go
Normal file
160
internal/server_test_helpers.go
Normal file
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
*
|
||||
* Copyright © 2020 nicksherron <nsherron90@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package internal
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var (
|
||||
dir string
|
||||
router *gin.Engine
|
||||
sysRegistered bool
|
||||
jwtToken string
|
||||
testDir string
|
||||
)
|
||||
|
||||
const (
|
||||
user = "tester"
|
||||
pass = "tester"
|
||||
mac = "888888888888888"
|
||||
email = "test@email.com"
|
||||
system = "system"
|
||||
)
|
||||
|
||||
func testRequest(method string, u string, body io.Reader) *httptest.ResponseRecorder {
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest(method, u, body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
return w
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func createUser(t *testing.T) {
|
||||
auth := map[string]interface{}{
|
||||
"Username": user,
|
||||
"password": pass,
|
||||
"email": email,
|
||||
}
|
||||
|
||||
payloadBytes, err := json.Marshal(auth)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := testRequest("POST", "/api/v1/user", body)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}
|
||||
|
||||
func getToken(t *testing.T) string {
|
||||
|
||||
auth := map[string]interface{}{
|
||||
"username": user,
|
||||
"password": pass,
|
||||
"mac": mac,
|
||||
}
|
||||
|
||||
payloadBytes, err := json.Marshal(auth)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := testRequest("POST", "/api/v1/login", body)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
|
||||
buf, err := ioutil.ReadAll(w.Body)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
j := make(map[string]interface{})
|
||||
|
||||
json.Unmarshal(buf, &j)
|
||||
|
||||
if len(j) == 0 {
|
||||
t.Fatal("login failed for getToken")
|
||||
|
||||
}
|
||||
token := fmt.Sprintf("Bearer %v", j["accessToken"])
|
||||
|
||||
if !sysRegistered {
|
||||
// register system
|
||||
return sysRegister(t, token)
|
||||
}
|
||||
return token
|
||||
}
|
||||
|
||||
func sysRegister(t *testing.T, token string) string {
|
||||
|
||||
jwtToken = token
|
||||
host, err := os.Hostname()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
sys := map[string]interface{}{
|
||||
"clientVersion": "1.2.0",
|
||||
"name": system,
|
||||
"hostname": host,
|
||||
"mac": mac,
|
||||
}
|
||||
payloadBytes, err := json.Marshal(sys)
|
||||
check(err)
|
||||
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
|
||||
w := testRequest("POST", "/api/v1/system", body)
|
||||
assert.Equal(t, 201, w.Code)
|
||||
|
||||
sysRegistered = true
|
||||
|
||||
return getToken(t)
|
||||
|
||||
}
|
||||
|
||||
func dirCleanup() {
|
||||
dbFiles := []string{
|
||||
"test.db", "test.db-shm", "test.db-wal",
|
||||
}
|
||||
for _, d := range dbFiles {
|
||||
err := os.RemoveAll(filepath.Join([]string{testDir, d}...))
|
||||
check(err)
|
||||
}
|
||||
}
|
||||
|
34
scripts/test_postgres.sh
Executable file
34
scripts/test_postgres.sh
Executable file
|
@ -0,0 +1,34 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright © 2020 nicksherron <nsherron90@gmail.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
#
|
||||
|
||||
set -eou pipefail
|
||||
|
||||
CONTAINER="bashhub-postgres-test"
|
||||
|
||||
docker run -d --rm --name ${CONTAINER} -p 5444:5432 postgres
|
||||
|
||||
|
||||
until [ "$(docker exec bashhub-postgres-test pg_isready \
|
||||
-p 5432 -h localhost -U postgres -d postgres)" == "localhost:5432 - accepting connections" ]; do
|
||||
sleep 0.1;
|
||||
done;
|
||||
|
||||
go test -v github.com/nicksherron/bashhub-server/internal \
|
||||
-postgres -postgres-uri "postgres://postgres:@localhost:5444?sslmode=disable"
|
||||
|
||||
docker stop -t 0 ${CONTAINER} & docker wait ${CONTAINER}
|
|
@ -1,491 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* Copyright © 2020 nicksherron <nsherron90@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
"github.com/nicksherron/bashhub-server/internal"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var (
|
||||
dir string
|
||||
router *gin.Engine
|
||||
sysRegistered bool
|
||||
jwtToken string
|
||||
db = flag.String("db", sqliteDB(), "db path")
|
||||
postgres = flag.Bool("postgres", false, "run postgres tests")
|
||||
postgresUri = flag.String("postgres-uri", "postgres://postgres:@localhost:5444?sslmode=disable", "postgres uri to use for postgres tests")
|
||||
)
|
||||
|
||||
const (
|
||||
system = "system"
|
||||
user = "tester"
|
||||
pass = "tester"
|
||||
mac = "888888888888888"
|
||||
email = "test@email.com"
|
||||
testdir = "testdata"
|
||||
)
|
||||
|
||||
func sqliteDB() string {
|
||||
return filepath.Join(dir, "testdata/test.db")
|
||||
}
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func createUser(t *testing.T) {
|
||||
auth := map[string]interface{}{
|
||||
"Username": user,
|
||||
"password": pass,
|
||||
"email": email,
|
||||
}
|
||||
|
||||
payloadBytes, err := json.Marshal(auth)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("POST", "/api/v1/user", body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}
|
||||
|
||||
func getToken(t *testing.T) string {
|
||||
|
||||
auth := map[string]interface{}{
|
||||
"username": user,
|
||||
"password": pass,
|
||||
"mac": mac,
|
||||
}
|
||||
|
||||
payloadBytes, err := json.Marshal(auth)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("POST", "/api/v1/login", body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
router.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, 200, w.Code)
|
||||
|
||||
buf, err := ioutil.ReadAll(w.Body)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
j := make(map[string]interface{})
|
||||
|
||||
json.Unmarshal(buf, &j)
|
||||
|
||||
if len(j) == 0 {
|
||||
t.Fatal("login failed for getToken")
|
||||
|
||||
}
|
||||
token := fmt.Sprintf("Bearer %v", j["accessToken"])
|
||||
|
||||
if !sysRegistered {
|
||||
// register system
|
||||
return sysRegister(t, token)
|
||||
}
|
||||
return token
|
||||
}
|
||||
|
||||
func sysRegister(t *testing.T, token string) string {
|
||||
|
||||
host, err := os.Hostname()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
sys := map[string]interface{}{
|
||||
"clientVersion": "1.2.0",
|
||||
"name": system,
|
||||
"hostname": host,
|
||||
"mac": mac,
|
||||
}
|
||||
payloadBytes, err := json.Marshal(sys)
|
||||
check(err)
|
||||
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("POST", "/api/v1/system", body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", token)
|
||||
|
||||
router.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, 201, w.Code)
|
||||
|
||||
sysRegistered = true
|
||||
|
||||
return getToken(t)
|
||||
|
||||
}
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
flag.Parse()
|
||||
|
||||
if *db == sqliteDB() {
|
||||
|
||||
err := os.RemoveAll(testdir)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
err = os.Mkdir(testdir, 0700)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
var err error
|
||||
dir, err = os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
internal.DbPath = *db
|
||||
router = internal.SetupRouter()
|
||||
m.Run()
|
||||
|
||||
if *postgres {
|
||||
internal.DbPath = *postgresUri
|
||||
router = internal.SetupRouter()
|
||||
m.Run()
|
||||
}
|
||||
}
|
||||
|
||||
func TestToken(t *testing.T) {
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
|
||||
req, _ := http.NewRequest("GET", "/ping", nil)
|
||||
router.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, 200, w.Code)
|
||||
assert.Equal(t, "{\"message\":\"pong\"}\n", w.Body.String())
|
||||
createUser(t)
|
||||
sysRegistered = false
|
||||
jwtToken = getToken(t)
|
||||
|
||||
}
|
||||
|
||||
var commandTests = []internal.Command{
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "cat foo.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "ls"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "pwd"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "whoami"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "which cat"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "head foo.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "sed 's/fooobaar/foobar/g' somefile.txt"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "curl google.com"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "file /dev/null"},
|
||||
{ProcessId: 90226, ExitStatus: 0, Command: "df -h"},
|
||||
{ProcessId: 90226, ExitStatus: 127, Command: "catt"},
|
||||
{ProcessId: 90226, ExitStatus: 127, Command: "cay"},
|
||||
}
|
||||
|
||||
func TestCommand(t *testing.T) {
|
||||
hourAgo := time.Now().UnixNano() - (1 * time.Hour).Nanoseconds()
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
for _, tc := range commandTests {
|
||||
uid, err := uuid.NewRandom()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tc.Path = dir
|
||||
tc.Created = time.Now().Unix()
|
||||
tc.ProcessStartTime = hourAgo
|
||||
tc.Uuid = uid.String()
|
||||
payloadBytes, err := json.Marshal(&tc)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
body := bytes.NewReader(payloadBytes)
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("POST", "/api/v1/command", body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}
|
||||
}
|
||||
|
||||
var allQueries = map[string]string{
|
||||
"unique": "true",
|
||||
"limit": "1",
|
||||
"query": "curl",
|
||||
"path": dir,
|
||||
"systemName": system,
|
||||
}
|
||||
var queryTests []url.Values
|
||||
allQuery := url.Values{}
|
||||
|
||||
for keyP, valP := range allQueries {
|
||||
allQuery.Add(keyP, valP)
|
||||
|
||||
for kepC, valC := range allQueries {
|
||||
if keyP == kepC {
|
||||
continue
|
||||
}
|
||||
v := url.Values{}
|
||||
v.Add(kepC, valC)
|
||||
v.Add(keyP, valP)
|
||||
queryTests = append(queryTests, v)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", allQuery.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}()
|
||||
|
||||
for _, v := range queryTests {
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Query
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
assert.GreaterOrEqual(t, len(data), 1)
|
||||
assert.Contains(t, system, data[0].SystemName)
|
||||
assert.Contains(t, dir, data[0].Path)
|
||||
}()
|
||||
}
|
||||
|
||||
|
||||
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
v := url.Values{}
|
||||
v.Add("unique", "true")
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 10, len(data))
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("GET", "/api/v1/command/search?", nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 50, len(data))
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
v := url.Values{}
|
||||
v.Add("query", "curl")
|
||||
v.Add("unique", "true")
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 1, len(data))
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
v := url.Values{}
|
||||
v.Add("unique", "true")
|
||||
v.Add("systemName", system)
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 10, len(data))
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
v := url.Values{}
|
||||
v.Add("path", dir)
|
||||
v.Add("unique", "true")
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 10, len(data))
|
||||
}()
|
||||
var record internal.Command
|
||||
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
v := url.Values{}
|
||||
v.Add("limit","1")
|
||||
v.Add("unique", "true")
|
||||
u := fmt.Sprintf("/api/v1/command/search?%v", v.Encode())
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 1, len(data))
|
||||
record = data[0]
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
u := fmt.Sprintf("/api/v1/command/%v", record.Uuid)
|
||||
req, _ := http.NewRequest("GET", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, record.Uuid, data.Uuid)
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
u := fmt.Sprintf("/api/v1/command/%v", record.Uuid)
|
||||
req, _ := http.NewRequest("DELETE", u, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
}()
|
||||
func() {
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("GET", "/api/v1/command/search?", nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", jwtToken)
|
||||
router.ServeHTTP(w, req)
|
||||
assert.Equal(t, 200, w.Code)
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var data []internal.Command
|
||||
err = json.Unmarshal(b, &data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 49, len(data))
|
||||
}()
|
||||
}
|
Loading…
Add table
Reference in a new issue