diff --git a/api/datastore/sql/sql.go b/api/datastore/sql/sql.go index 1f7fe93b6..a24b3fe3f 100644 --- a/api/datastore/sql/sql.go +++ b/api/datastore/sql/sql.go @@ -222,19 +222,33 @@ func (ds *sqlStore) UpdateApp(ctx context.Context, newapp *models.App) (*models. } func (ds *sqlStore) RemoveApp(ctx context.Context, appName string) error { - res, err := ds.db.ExecContext(ctx, ds.db.Rebind( - `DELETE FROM apps WHERE name = ?; - DELETE FROM logs WHERE app_name=?; - DELETE FROM calls WHERE app_name=?; - DELETE FROM routes WHERE app_name=?;`), appName, appName, appName, appName) - if err != nil { - return err - } - _, err = res.RowsAffected() - if err == sql.ErrNoRows { - return models.ErrAppsNotFound - } - return err + return ds.Tx(func(tx *sqlx.Tx) error { + res, err := tx.ExecContext(ctx, tx.Rebind(`DELETE FROM apps WHERE name=?`), appName) + if err != nil { + return err + } + n, err := res.RowsAffected() + if err != nil { + return err + } + if n == 0 { + return models.ErrAppsNotFound + } + + deletes := []string{ + `DELETE FROM logs WHERE app_name=?`, + `DELETE FROM calls WHERE app_name=?`, + `DELETE FROM routes WHERE app_name=?`, + } + + for _, stmt := range deletes { + _, err := tx.ExecContext(ctx, tx.Rebind(stmt), appName) + if err != nil { + return err + } + } + return nil + }) } func (ds *sqlStore) GetApp(ctx context.Context, name string) (*models.App, error) { diff --git a/test/fn-api-tests/apps_api.go b/test/fn-api-tests/apps_api.go index 6145ea34e..cbfeffe15 100644 --- a/test/fn-api-tests/apps_api.go +++ b/test/fn-api-tests/apps_api.go @@ -14,6 +14,9 @@ import ( func CheckAppResponseError(t *testing.T, e error) { if e != nil { switch err := e.(type) { + case *apps.DeleteAppsAppNotFound: + t.Errorf("Unexpected error occurred: %v Original Location: %s", err.Payload.Error.Message, MyCaller()) + t.FailNow() case *apps.DeleteAppsAppDefault: t.Errorf("Unexpected error occurred: %v. Status code: %v Orig Location: %s", err.Payload.Error.Message, err.Code(), MyCaller()) t.FailNow() diff --git a/test/fn-api-tests/apps_test.go b/test/fn-api-tests/apps_test.go index c898d0862..fd0192fa1 100644 --- a/test/fn-api-tests/apps_test.go +++ b/test/fn-api-tests/apps_test.go @@ -11,6 +11,20 @@ import ( func TestApps(t *testing.T) { + t.Run("delete-app-not-found-test", func(t *testing.T) { + t.Parallel() + s := SetupDefaultSuite() + cfg := &apps.DeleteAppsAppParams{ + App: "missing-app", + Context: s.Context, + } + cfg.WithTimeout(time.Second * 60) + _, err := s.Client.Apps.DeleteAppsApp(cfg) + if err == nil { + t.Errorf("Error during app delete: we should get HTTP 404, but got: %s", err.Error()) + } + }) + t.Run("app-not-found-test", func(t *testing.T) { t.Parallel() s := SetupDefaultSuite()