diff --git a/.gitea/workflows/Dockerfile_tests b/.gitea/workflows/Dockerfile_tests new file mode 100644 index 0000000..ba6ae3a --- /dev/null +++ b/.gitea/workflows/Dockerfile_tests @@ -0,0 +1,9 @@ +FROM golang:latest + +RUN apt install -y make curl python3 && go install gotest.tools/gotestsum@latest + +COPY . /source + +WORKDIR /source + +CMD ["make", "test"] diff --git a/.gitea/workflows/tests.yml b/.gitea/workflows/tests.yml new file mode 100644 index 0000000..22fabbc --- /dev/null +++ b/.gitea/workflows/tests.yml @@ -0,0 +1,30 @@ + +# https://docs.gitea.com/next/usage/actions/quickstart +# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions +# https://docs.github.com/en/actions/learn-github-actions/contexts#github-context + +name: Build Docker and Deploy +run-name: Build & Deploy ${{ gitea.ref }} on ${{ gitea.actor }} + +on: [push] + +jobs: + run_tests: + name: Run goext test-suite + runs-on: bfb-cicd-latest + steps: + + - name: Check out code + uses: actions/checkout@v3 + + - name: Build test docker + id: build_docker + run: echo "DOCKER_IMG_ID=$(docker build -q . -f .gitea/workflows/Dockerfile_tests || echo __err_build__)" >> $GITHUB_OUTPUT + + - name: Run tests + run: docker run --rm "${{ steps.build_docker.outputs.DOCKER_IMG_ID }}" + + - name: Cleanup + if: always() + run: docker image rm "${{ steps.build_docker.outputs.DOCKER_IMG_ID }}" + diff --git a/bfcodegen/_test_example.tgz b/bfcodegen/_test_example.tgz new file mode 100644 index 0000000..500f74a Binary files /dev/null and b/bfcodegen/_test_example.tgz differ diff --git a/bfcodegen/enum-generate_test.go b/bfcodegen/enum-generate_test.go index 94adb76..e92ae4c 100644 --- a/bfcodegen/enum-generate_test.go +++ b/bfcodegen/enum-generate_test.go @@ -1,15 +1,42 @@ package bfcodegen import ( + _ "embed" + "gogs.mikescher.com/BlackForestBytes/goext/cmdext" + "gogs.mikescher.com/BlackForestBytes/goext/langext" + "gogs.mikescher.com/BlackForestBytes/goext/tst" + "os" + "path/filepath" "testing" + "time" ) -func TestApplyEnvOverridesSimple(t *testing.T) { +//go:embed _test_example.tgz +var ExampleModels []byte - err := GenerateEnumSpecs("/home/mike/Code/reiff/badennet/bnet-backend/models", "/home/mike/Code/reiff/badennet/bnet-backend/models/enums_gen.go") - if err != nil { - t.Error(err) - t.Fail() - } +func TestGenerateEnumSpecs(t *testing.T) { + + tmpFile := filepath.Join(t.TempDir(), langext.MustHexUUID()+".tgz") + + tmpDir := filepath.Join(t.TempDir(), langext.MustHexUUID()) + + err := os.WriteFile(tmpFile, ExampleModels, 0o777) + tst.AssertNoErr(t, err) + + t.Cleanup(func() { _ = os.Remove(tmpFile) }) + + err = os.Mkdir(tmpDir, 0o777) + tst.AssertNoErr(t, err) + + t.Cleanup(func() { _ = os.RemoveAll(tmpFile) }) + + _, err = cmdext.Runner("tar").Arg("-xvzf").Arg(tmpFile).Arg("-C").Arg(tmpDir).FailOnExitCode().FailOnTimeout().Timeout(time.Minute).Run() + tst.AssertNoErr(t, err) + + err = GenerateEnumSpecs(tmpDir, tmpDir+"/enums_gen.go") + tst.AssertNoErr(t, err) + + err = GenerateEnumSpecs(tmpDir, tmpDir+"/enums_gen.go") + tst.AssertNoErr(t, err) } diff --git a/cmdext/cmdrunner_test.go b/cmdext/cmdrunner_test.go index d83351a..90e2bdc 100644 --- a/cmdext/cmdrunner_test.go +++ b/cmdext/cmdrunner_test.go @@ -33,7 +33,7 @@ func TestStdout(t *testing.T) { func TestStderr(t *testing.T) { - res1, err := Runner("python").Arg("-c").Arg("import sys; print(\"error\", file=sys.stderr, end='')").Run() + res1, err := Runner("python3").Arg("-c").Arg("import sys; print(\"error\", file=sys.stderr, end='')").Run() if err != nil { t.Errorf("%v", err) } @@ -56,7 +56,7 @@ func TestStderr(t *testing.T) { } func TestStdcombined(t *testing.T) { - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"1\", file=sys.stderr, flush=True); time.sleep(0.1); print(\"2\", file=sys.stdout, flush=True); time.sleep(0.1); print(\"3\", file=sys.stderr, flush=True)"). Run() @@ -82,7 +82,7 @@ func TestStdcombined(t *testing.T) { } func TestPartialRead(t *testing.T) { - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"first message\", flush=True); time.sleep(5); print(\"cant see me\", flush=True);"). Timeout(100 * time.Millisecond). @@ -106,7 +106,7 @@ func TestPartialRead(t *testing.T) { } func TestPartialReadStderr(t *testing.T) { - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"first message\", file=sys.stderr, flush=True); time.sleep(5); print(\"cant see me\", file=sys.stderr, flush=True);"). Timeout(100 * time.Millisecond). @@ -131,7 +131,7 @@ func TestPartialReadStderr(t *testing.T) { func TestReadUnflushedStdout(t *testing.T) { - res1, err := Runner("python").Arg("-c").Arg("import sys; print(\"message101\", file=sys.stdout, end='')").Run() + res1, err := Runner("python3").Arg("-c").Arg("import sys; print(\"message101\", file=sys.stdout, end='')").Run() if err != nil { t.Errorf("%v", err) } @@ -155,7 +155,7 @@ func TestReadUnflushedStdout(t *testing.T) { func TestReadUnflushedStderr(t *testing.T) { - res1, err := Runner("python").Arg("-c").Arg("import sys; print(\"message101\", file=sys.stderr, end='')").Run() + res1, err := Runner("python3").Arg("-c").Arg("import sys; print(\"message101\", file=sys.stderr, end='')").Run() if err != nil { t.Errorf("%v", err) } @@ -180,7 +180,7 @@ func TestReadUnflushedStderr(t *testing.T) { func TestPartialReadUnflushed(t *testing.T) { t.SkipNow() - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"first message\", end=''); time.sleep(5); print(\"cant see me\", end='');"). Timeout(100 * time.Millisecond). @@ -206,7 +206,7 @@ func TestPartialReadUnflushed(t *testing.T) { func TestPartialReadUnflushedStderr(t *testing.T) { t.SkipNow() - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"first message\", file=sys.stderr, end=''); time.sleep(5); print(\"cant see me\", file=sys.stderr, end='');"). Timeout(100 * time.Millisecond). @@ -231,7 +231,7 @@ func TestPartialReadUnflushedStderr(t *testing.T) { func TestListener(t *testing.T) { - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys;" + "import time;" + @@ -264,7 +264,7 @@ func TestListener(t *testing.T) { func TestLongStdout(t *testing.T) { - res1, err := Runner("python"). + res1, err := Runner("python3"). Arg("-c"). Arg("import sys; import time; print(\"X\" * 125001 + \"\\n\"); print(\"Y\" * 125001 + \"\\n\"); print(\"Z\" * 125001 + \"\\n\");"). Timeout(5000 * time.Millisecond). @@ -298,7 +298,7 @@ func TestFailOnTimeout(t *testing.T) { func TestFailOnStderr(t *testing.T) { - res1, err := Runner("python").Arg("-c").Arg("import sys; print(\"error\", file=sys.stderr, end='')").FailOnStderr().Run() + res1, err := Runner("python3").Arg("-c").Arg("import sys; print(\"error\", file=sys.stderr, end='')").FailOnStderr().Run() if err == nil { t.Errorf("no err") } diff --git a/rfctime/rfc3339.go b/rfctime/rfc3339.go index 3a8190e..83dfcaf 100644 --- a/rfctime/rfc3339.go +++ b/rfctime/rfc3339.go @@ -69,7 +69,7 @@ func (t *RFC3339Time) UnmarshalText(data []byte) error { } func (t *RFC3339Time) UnmarshalBSONValue(bt bsontype.Type, data []byte) error { - if bt == bsontype.Null { + if bt == bson.TypeNull { // we can't set nil in UnmarshalBSONValue (so we use default(struct)) // Use mongoext.CreateGoExtBsonRegistry if you need to unmarsh pointer values // https://stackoverflow.com/questions/75167597 @@ -77,7 +77,7 @@ func (t *RFC3339Time) UnmarshalBSONValue(bt bsontype.Type, data []byte) error { *t = RFC3339Time{} return nil } - if bt != bsontype.DateTime { + if bt != bson.TypeDateTime { return errors.New(fmt.Sprintf("cannot unmarshal %v into RFC3339Time", bt)) } var tt time.Time diff --git a/rfctime/rfc3339Nano.go b/rfctime/rfc3339Nano.go index f0a4d90..76bbbb6 100644 --- a/rfctime/rfc3339Nano.go +++ b/rfctime/rfc3339Nano.go @@ -69,7 +69,7 @@ func (t *RFC3339NanoTime) UnmarshalText(data []byte) error { } func (t *RFC3339NanoTime) UnmarshalBSONValue(bt bsontype.Type, data []byte) error { - if bt == bsontype.Null { + if bt == bson.TypeNull { // we can't set nil in UnmarshalBSONValue (so we use default(struct)) // Use mongoext.CreateGoExtBsonRegistry if you need to unmarsh pointer values // https://stackoverflow.com/questions/75167597 @@ -77,7 +77,7 @@ func (t *RFC3339NanoTime) UnmarshalBSONValue(bt bsontype.Type, data []byte) erro *t = RFC3339NanoTime{} return nil } - if bt != bsontype.DateTime { + if bt != bson.TypeDateTime { return errors.New(fmt.Sprintf("cannot unmarshal %v into RFC3339NanoTime", bt)) } var tt time.Time diff --git a/rfctime/rfc3339Nano_test.go b/rfctime/rfc3339Nano_test.go index 19cd474..b63e154 100644 --- a/rfctime/rfc3339Nano_test.go +++ b/rfctime/rfc3339Nano_test.go @@ -2,6 +2,7 @@ package rfctime import ( "encoding/json" + "gogs.mikescher.com/BlackForestBytes/goext/timeext" "gogs.mikescher.com/BlackForestBytes/goext/tst" "testing" "time" @@ -13,7 +14,7 @@ func TestRoundtrip(t *testing.T) { Value RFC3339NanoTime `json:"v"` } - val1 := NewRFC3339Nano(time.Unix(0, 1675951556820915171)) + val1 := NewRFC3339Nano(time.Unix(0, 1675951556820915171).In(timeext.TimezoneBerlin)) w1 := Wrap{val1} jstr1, err := json.Marshal(w1)