Skip to content

Commit 47de395

Browse files
author
Daan Vinken
committed
feat: add test for external plan store recovery path
Signed-off-by: Daan Vinken <dvinken@tesla.com>
1 parent c1a7e47 commit 47de395

File tree

3 files changed

+175
-51
lines changed

3 files changed

+175
-51
lines changed

go.mod

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ require (
66
code.gitea.io/sdk/gitea v0.23.2
77
github.com/Masterminds/sprig/v3 v3.3.0
88
github.com/alicebob/miniredis/v2 v2.36.1
9+
github.com/aws/aws-sdk-go-v2 v1.41.4
10+
github.com/aws/aws-sdk-go-v2/config v1.32.12
11+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1
912
github.com/bmatcuk/doublestar/v4 v4.10.0
1013
github.com/bradleyfalzon/ghinstallation/v2 v2.17.0
1114
github.com/briandowns/spinner v1.23.2
@@ -74,21 +77,21 @@ require (
7477
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
7578
github.com/ProtonMail/gopenpgp/v2 v2.7.5 // indirect
7679
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
77-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect
78-
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 // indirect
79-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 // indirect
80-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect
81-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect
82-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect
83-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 // indirect
84-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect
85-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 // indirect
86-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect
87-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 // indirect
88-
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect
89-
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect
90-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect
91-
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 // indirect
80+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect
81+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect
82+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect
83+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect
84+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect
85+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
86+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect
87+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
88+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect
89+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect
90+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect
91+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect
92+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect
93+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect
94+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect
9295
github.com/aws/smithy-go v1.24.2 // indirect
9396
github.com/aymerick/douceur v0.2.0 // indirect
9497
github.com/beorn7/perks v1.0.1 // indirect

go.sum

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -67,42 +67,42 @@ github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew
6767
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
6868
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
6969
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
70-
github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA=
71-
github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
72-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 h1:N4lRUXZpZ1KVEUn6hxtco/1d2lgYhNn1fHkkl8WhlyQ=
73-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI=
74-
github.com/aws/aws-sdk-go-v2/config v1.32.11 h1:ftxI5sgz8jZkckuUHXfC/wMUc8u3fG1vQS0plr2F2Zs=
75-
github.com/aws/aws-sdk-go-v2/config v1.32.11/go.mod h1:twF11+6ps9aNRKEDimksp923o44w/Thk9+8YIlzWMmo=
76-
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 h1:NdV8cwCcAXrCWyxArt58BrvZJ9pZ9Fhf9w6Uh5W3Uyc=
77-
github.com/aws/aws-sdk-go-v2/credentials v1.19.11/go.mod h1:30yY2zqkMPdrvxBqzI9xQCM+WrlrZKSOpSJEsylVU+8=
78-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 h1:INUvJxmhdEbVulJYHI061k4TVuS3jzzthNvjqvVvTKM=
79-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19/go.mod h1:FpZN2QISLdEBWkayloda+sZjVJL+e9Gl0k1SyTgcswU=
80-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA=
81-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0=
82-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE=
83-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw=
84-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 h1:clHU5fm//kWS1C2HgtgWxfQbFbx4b6rx+5jzhgX9HrI=
85-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
86-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 h1:qi3e/dmpdONhj1RyIZdi6DKKpDXS5Lb8ftr3p7cyHJc=
87-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20/go.mod h1:V1K+TeJVD5JOk3D9e5tsX2KUdL7BlB+FV6cBhdobN8c=
88-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg=
89-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
90-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 h1:BYf7XNsJMzl4mObARUBUib+j2tf0U//JAAtTnYqvqCw=
91-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11/go.mod h1:aEUS4WrNk/+FxkBZZa7tVgp4pGH+kFGW40Y8rCPqt5g=
92-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw=
93-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA=
94-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 h1:JnQeStZvPHFHeyky/7LbMlyQjUa+jIBj36OlWm0pzIk=
95-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19/go.mod h1:HGyasyHvYdFQeJhvDHfH7HXkHh57htcJGKDZ+7z+I24=
96-
github.com/aws/aws-sdk-go-v2/service/s3 v1.96.4 h1:4ExZyubQ6LQQVuF2Qp9OsfEvsTdAWh5Gfwf6PgIdLdk=
97-
github.com/aws/aws-sdk-go-v2/service/s3 v1.96.4/go.mod h1:NF3JcMGOiARAss1ld3WGORCw71+4ExDD2cbbdKS5PpA=
98-
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 h1:Y2cAXlClHsXkkOvWZFXATr34b0hxxloeQu/pAZz2row=
99-
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7/go.mod h1:idzZ7gmDeqeNrSPkdbtMp9qWMgcBwykA7P7Rzh5DXVU=
100-
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 h1:iSsvB9EtQ09YrsmIc44Heqlx5ByGErqhPK1ZQLppias=
101-
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12/go.mod h1:fEWYKTRGoZNl8tZ77i61/ccwOMJdGxwOhWCkp6TXAr0=
102-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 h1:EnUdUqRP1CNzt2DkV67tJx6XDN4xlfBFm+bzeNOQVb0=
103-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16/go.mod h1:Jic/xv0Rq/pFNCh3WwpH4BEqdbSAl+IyHro8LbibHD8=
104-
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 h1:XQTQTF75vnug2TXS8m7CVJfC2nniYPZnO1D4Np761Oo=
105-
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8/go.mod h1:Xgx+PR1NUOjNmQY+tRMnouRp83JRM8pRMw/vCaVhPkI=
70+
github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k=
71+
github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
72+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY=
73+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI=
74+
github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0=
75+
github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g=
76+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8=
77+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE=
78+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo=
79+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE=
80+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc=
81+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o=
82+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw=
83+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc=
84+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
85+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
86+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA=
87+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k=
88+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
89+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
90+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ=
91+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ=
92+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y=
93+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk=
94+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA=
95+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw=
96+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE=
97+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0=
98+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow=
99+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE=
100+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o=
101+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8=
102+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU=
103+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA=
104+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU=
105+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk=
106106
github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
107107
github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
108108
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=

server/events/project_command_builder_test.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,127 @@ func TestDefaultProjectCommandBuilder_BuildMultiApply(t *testing.T) {
13281328
Equals(t, "workspace2", ctxs[3].Workspace)
13291329
}
13301330

1331+
// Test that when GetPullDir returns os.ErrNotExist with an external PlanStore,
1332+
// the builder re-clones and calls RestorePlans before discovering plans.
1333+
func TestDefaultProjectCommandBuilder_ExternalPlanStoreRecovery(t *testing.T) {
1334+
RegisterMockTestingT(t)
1335+
1336+
// The directory that will exist after "re-clone".
1337+
tmpDir := DirStructure(t, map[string]any{
1338+
"default": map[string]any{
1339+
"project1": map[string]any{
1340+
"main.tf": nil,
1341+
"default.tfplan": nil,
1342+
},
1343+
},
1344+
})
1345+
runCmd(t, filepath.Join(tmpDir, "default"), "git", "init")
1346+
1347+
workingDir := mocks.NewMockWorkingDir()
1348+
// First GetPullDir call: directory missing (pod restart).
1349+
// Second GetPullDir call: directory exists after re-clone.
1350+
When(workingDir.GetPullDir(
1351+
Any[models.Repo](),
1352+
Any[models.PullRequest]())).
1353+
ThenReturn("", os.ErrNotExist).
1354+
ThenReturn(tmpDir, nil)
1355+
1356+
When(workingDir.Clone(
1357+
Any[logging.SimpleLogging](),
1358+
Any[models.Repo](),
1359+
Any[models.PullRequest](),
1360+
Any[string]())).
1361+
ThenReturn(tmpDir, nil)
1362+
1363+
When(workingDir.GetWorkingDir(
1364+
Any[models.Repo](),
1365+
Any[models.PullRequest](),
1366+
Any[string]())).
1367+
ThenReturn(tmpDir, nil)
1368+
1369+
logger := logging.NewNoopLogger(t)
1370+
userConfig := defaultUserConfig
1371+
globalCfgArgs := valid.GlobalCfgArgs{}
1372+
scope := metricstest.NewLoggingScope(t, logger, "atlantis")
1373+
terraformClient := tfclientmocks.NewMockClient()
1374+
1375+
restoreCalled := false
1376+
planStore := &mockExternalPlanStore{
1377+
restoreFn: func(pullDir, owner, repo string, pullNum int) error {
1378+
restoreCalled = true
1379+
return nil
1380+
},
1381+
}
1382+
1383+
builder := events.NewProjectCommandBuilder(
1384+
false,
1385+
&config.ParserValidator{},
1386+
&events.DefaultProjectFinder{},
1387+
nil,
1388+
workingDir,
1389+
events.NewDefaultWorkingDirLocker(),
1390+
valid.NewGlobalCfgFromArgs(globalCfgArgs),
1391+
&events.DefaultPendingPlanFinder{},
1392+
&events.CommentParser{ExecutableName: "atlantis"},
1393+
userConfig.SkipCloneNoChanges,
1394+
userConfig.EnableRegExpCmd,
1395+
userConfig.EnableAutoMerge,
1396+
userConfig.EnableParallelPlan,
1397+
userConfig.EnableParallelApply,
1398+
userConfig.AutoDetectModuleFiles,
1399+
userConfig.AutoplanFileList,
1400+
userConfig.RestrictFileList,
1401+
userConfig.SilenceNoProjects,
1402+
userConfig.IncludeGitUntrackedFiles,
1403+
userConfig.AutoDiscoverMode,
1404+
scope,
1405+
terraformClient,
1406+
planStore,
1407+
)
1408+
1409+
ctxs, err := builder.BuildApplyCommands(
1410+
&command.Context{
1411+
Log: logger,
1412+
Scope: scope,
1413+
},
1414+
&events.CommentCommand{
1415+
RepoRelDir: "",
1416+
Flags: nil,
1417+
Name: command.Apply,
1418+
Verbose: false,
1419+
Workspace: "",
1420+
ProjectName: "",
1421+
})
1422+
Ok(t, err)
1423+
Assert(t, restoreCalled, "expected RestorePlans to be called")
1424+
Equals(t, 1, len(ctxs))
1425+
Equals(t, "project1", ctxs[0].RepoRelDir)
1426+
1427+
// Verify Clone was called (re-clone after missing pull dir).
1428+
workingDir.VerifyWasCalledOnce().Clone(
1429+
Any[logging.SimpleLogging](),
1430+
Any[models.Repo](),
1431+
Any[models.PullRequest](),
1432+
Any[string]())
1433+
}
1434+
1435+
// mockExternalPlanStore is a non-LocalPlanStore implementation for testing the
1436+
// external plan store recovery path.
1437+
type mockExternalPlanStore struct {
1438+
restoreFn func(pullDir, owner, repo string, pullNum int) error
1439+
}
1440+
1441+
func (m *mockExternalPlanStore) Save(_ command.ProjectContext, _ string) error { return nil }
1442+
func (m *mockExternalPlanStore) Load(_ command.ProjectContext, _ string) error { return nil }
1443+
func (m *mockExternalPlanStore) Remove(_ command.ProjectContext, _ string) error { return nil }
1444+
func (m *mockExternalPlanStore) RestorePlans(pullDir, owner, repo string, pullNum int) error {
1445+
if m.restoreFn != nil {
1446+
return m.restoreFn(pullDir, owner, repo, pullNum)
1447+
}
1448+
return nil
1449+
}
1450+
func (m *mockExternalPlanStore) DeleteForPull(_, _ string, _ int) error { return nil }
1451+
13311452
// Test that if a directory has a list of workspaces configured then we don't
13321453
// allow plans for other workspace names.
13331454
func TestDefaultProjectCommandBuilder_WrongWorkspaceName(t *testing.T) {

0 commit comments

Comments
 (0)