11package services
22
33import (
4+ "os"
5+ "path/filepath"
46 "testing"
57
68 "github.com/smocker-dev/smocker/server/types"
79 "gopkg.in/yaml.v3"
810)
911
12+ func newTestMocks (t * testing.T ) Mocks {
13+ t .Helper ()
14+ svc , err := NewMocks (nil , 0 , NewPersistence ("" ), "" )
15+ if err != nil {
16+ t .Fatalf ("NewMocks: %v" , err )
17+ }
18+ return svc
19+ }
20+
1021func mockFromYAML (t * testing.T , s string ) * types.Mock {
1122 t .Helper ()
1223 var m types.Mock
@@ -16,10 +27,69 @@ func mockFromYAML(t *testing.T, s string) *types.Mock {
1627 return & m
1728}
1829
30+ // TestNewMocksInitFile covers the --init-mocks path: a YAML file of mocks (the POST /mocks format)
31+ // is loaded into a fresh "init-mocks" session when the service is constructed.
32+ func TestNewMocksInitFile (t * testing.T ) {
33+ path := filepath .Join (t .TempDir (), "mocks.yml" )
34+ content := `
35+ - request:
36+ method: GET
37+ path: /hello
38+ response:
39+ status: 200
40+ body: hi
41+ - request:
42+ method: GET
43+ path: /health
44+ response:
45+ status: 204
46+ `
47+ if err := os .WriteFile (path , []byte (content ), 0o644 ); err != nil {
48+ t .Fatal (err )
49+ }
50+
51+ svc , err := NewMocks (nil , 0 , NewPersistence ("" ), path )
52+ if err != nil {
53+ t .Fatalf ("NewMocks: %v" , err )
54+ }
55+
56+ session := svc .GetLastSession ()
57+ if session == nil {
58+ t .Fatal ("expected a seeded session" )
59+ }
60+ if session .Name != "init-mocks" {
61+ t .Fatalf ("expected the seeded session to be named %q, got %q" , "init-mocks" , session .Name )
62+ }
63+ mocks , err := svc .GetMocks (session .ID )
64+ if err != nil {
65+ t .Fatalf ("GetMocks: %v" , err )
66+ }
67+ if len (mocks ) != 2 {
68+ t .Fatalf ("expected 2 seeded mocks, got %d" , len (mocks ))
69+ }
70+ }
71+
72+ func TestNewMocksInitFileMissing (t * testing.T ) {
73+ if _ , err := NewMocks (nil , 0 , NewPersistence ("" ), filepath .Join (t .TempDir (), "nope.yml" )); err == nil {
74+ t .Fatal ("expected an error for a missing file" )
75+ }
76+ }
77+
78+ func TestNewMocksInitFileInvalid (t * testing.T ) {
79+ path := filepath .Join (t .TempDir (), "mocks.yml" )
80+ // A mock with neither response, proxy, nor dynamic_response fails Validate().
81+ if err := os .WriteFile (path , []byte ("- request: {path: /a}\n " ), 0o644 ); err != nil {
82+ t .Fatal (err )
83+ }
84+ if _ , err := NewMocks (nil , 0 , NewPersistence ("" ), path ); err == nil {
85+ t .Fatal ("expected a validation error for an incomplete mock" )
86+ }
87+ }
88+
1989// TestUpdateAndDeleteMock covers the happy path for the edit/delete feature (issues #299/#266/#303)
2090// while the session history is still empty.
2191func TestUpdateAndDeleteMock (t * testing.T ) {
22- svc := NewMocks ( nil , 0 , NewPersistence ( "" ) )
92+ svc := newTestMocks ( t )
2393 session := svc .NewSession ("edit" )
2494
2595 added , err := svc .AddMock (
@@ -71,7 +141,7 @@ func TestUpdateAndDeleteMock(t *testing.T) {
71141
72142// TestDeleteSession covers removing a single session and the not-found path.
73143func TestDeleteSession (t * testing.T ) {
74- svc := NewMocks ( nil , 0 , NewPersistence ( "" ) )
144+ svc := newTestMocks ( t )
75145 keep := svc .NewSession ("keep" )
76146 drop := svc .NewSession ("drop" )
77147
@@ -95,7 +165,7 @@ func TestDeleteSession(t *testing.T) {
95165// TestEditForbiddenOnceCalled locks the maintainers' position: once the session has received calls,
96166// mocks are append-only (history entries are tied to the mock that answered them).
97167func TestEditForbiddenOnceCalled (t * testing.T ) {
98- svc := NewMocks ( nil , 0 , NewPersistence ( "" ) )
168+ svc := newTestMocks ( t )
99169 session := svc .NewSession ("called" )
100170 added , err := svc .AddMock (
101171 session .ID ,
0 commit comments