2023-11-24 11:15:46 +00:00
package terraform
import (
"context"
"encoding/json"
2024-10-02 13:53:24 +00:00
"fmt"
2023-11-24 11:15:46 +00:00
"io"
"testing"
"github.com/databricks/cli/bundle"
"github.com/databricks/cli/bundle/config"
2024-02-08 15:18:53 +00:00
mockfiler "github.com/databricks/cli/internal/mocks/libs/filer"
2023-11-24 11:15:46 +00:00
"github.com/databricks/cli/libs/filer"
"github.com/stretchr/testify/assert"
2024-02-08 15:18:53 +00:00
"github.com/stretchr/testify/mock"
2023-11-24 11:15:46 +00:00
)
func mockStateFilerForPush ( t * testing . T , fn func ( body io . Reader ) ) filer . Filer {
2024-02-08 15:18:53 +00:00
f := mockfiler . NewMockFiler ( t )
f .
2023-11-24 11:15:46 +00:00
EXPECT ( ) .
2024-02-08 15:18:53 +00:00
Write ( mock . Anything , mock . Anything , mock . Anything , filer . CreateParentDirectories , filer . OverwriteIfExists ) .
Run ( func ( ctx context . Context , path string , reader io . Reader , mode ... filer . WriteMode ) {
2023-11-24 11:15:46 +00:00
fn ( reader )
} ) .
Return ( nil ) .
Times ( 1 )
2024-02-08 15:18:53 +00:00
return f
2023-11-24 11:15:46 +00:00
}
func statePushTestBundle ( t * testing . T ) * bundle . Bundle {
return & bundle . Bundle {
2024-09-27 10:03:05 +00:00
BundleRootPath : t . TempDir ( ) ,
2023-11-24 11:15:46 +00:00
Config : config . Root {
Bundle : config . Bundle {
Target : "default" ,
} ,
} ,
}
}
func TestStatePush ( t * testing . T ) {
mock := mockStateFilerForPush ( t , func ( body io . Reader ) {
dec := json . NewDecoder ( body )
var contents map [ string ] int
err := dec . Decode ( & contents )
assert . NoError ( t , err )
assert . Equal ( t , map [ string ] int { "serial" : 4 } , contents )
} )
m := & statePush {
identityFiler ( mock ) ,
}
ctx := context . Background ( )
b := statePushTestBundle ( t )
// Write a stale local state file.
2024-07-18 09:47:59 +00:00
writeLocalState ( t , ctx , b , map [ string ] any { "serial" : 4 } )
2024-03-25 14:18:47 +00:00
diags := bundle . Apply ( ctx , b , m )
assert . NoError ( t , diags . Error ( ) )
2023-11-24 11:15:46 +00:00
}
2024-10-02 13:53:24 +00:00
func TestStatePushLargeState ( t * testing . T ) {
mock := mockfiler . NewMockFiler ( t )
m := & statePush {
identityFiler ( mock ) ,
}
ctx := context . Background ( )
b := statePushTestBundle ( t )
largeState := map [ string ] any { }
for i := 0 ; i < 1000000 ; i ++ {
largeState [ fmt . Sprintf ( "field_%d" , i ) ] = i
}
// Write a stale local state file.
writeLocalState ( t , ctx , b , largeState )
diags := bundle . Apply ( ctx , b , m )
assert . ErrorContains ( t , diags . Error ( ) , "Terraform state file size exceeds the maximum allowed size of 10485760 bytes. Please reduce the number of resources in your bundle, split your bundle into multiple or re-run the command with --force flag" )
// Force the write.
b = statePushTestBundle ( t )
b . Config . Bundle . Force = true
diags = bundle . Apply ( ctx , b , m )
assert . NoError ( t , diags . Error ( ) )
}