github.com/Elate-DevOps/migrate/v4@v4.0.12/database/neo4j/neo4j_test.go (about) 1 package neo4j 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "log" 8 "testing" 9 10 "github.com/dhui/dktest" 11 "github.com/neo4j/neo4j-go-driver/neo4j" 12 13 "github.com/Elate-DevOps/migrate/v4" 14 dt "github.com/Elate-DevOps/migrate/v4/database/testing" 15 "github.com/Elate-DevOps/migrate/v4/dktesting" 16 _ "github.com/Elate-DevOps/migrate/v4/source/file" 17 ) 18 19 var ( 20 opts = dktest.Options{ 21 PortRequired: true, ReadyFunc: isReady, 22 Env: map[string]string{"NEO4J_AUTH": "neo4j/migratetest", "NEO4J_ACCEPT_LICENSE_AGREEMENT": "yes"}, 23 } 24 specs = []dktesting.ContainerSpec{ 25 {ImageName: "neo4j:4.0", Options: opts}, 26 {ImageName: "neo4j:4.0-enterprise", Options: opts}, 27 {ImageName: "neo4j:3.5", Options: opts}, 28 {ImageName: "neo4j:3.5-enterprise", Options: opts}, 29 } 30 ) 31 32 func neoConnectionString(host, port string) string { 33 return fmt.Sprintf("bolt://neo4j:migratetest@%s:%s", host, port) 34 } 35 36 func isReady(ctx context.Context, c dktest.ContainerInfo) bool { 37 ip, port, err := c.Port(7687) 38 if err != nil { 39 return false 40 } 41 42 driver, err := neo4j.NewDriver( 43 neoConnectionString(ip, port), 44 neo4j.BasicAuth("neo4j", "migratetest", ""), 45 func(config *neo4j.Config) { 46 config.Encrypted = false 47 }) 48 if err != nil { 49 return false 50 } 51 defer func() { 52 if err := driver.Close(); err != nil { 53 log.Println("close error:", err) 54 } 55 }() 56 session, err := driver.Session(neo4j.AccessModeRead) 57 if err != nil { 58 return false 59 } 60 result, err := session.Run("RETURN 1", nil) 61 if err != nil { 62 return false 63 } else if result.Err() != nil { 64 return false 65 } 66 67 return true 68 } 69 70 func Test(t *testing.T) { 71 dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { 72 ip, port, err := c.Port(7687) 73 if err != nil { 74 t.Fatal(err) 75 } 76 77 n := &Neo4j{} 78 d, err := n.Open(neoConnectionString(ip, port)) 79 if err != nil { 80 t.Fatal(err) 81 } 82 defer func() { 83 if err := d.Close(); err != nil { 84 t.Error(err) 85 } 86 }() 87 dt.Test(t, d, []byte("MATCH (a) RETURN a")) 88 }) 89 } 90 91 func TestMigrate(t *testing.T) { 92 dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { 93 ip, port, err := c.Port(7687) 94 if err != nil { 95 t.Fatal(err) 96 } 97 98 n := &Neo4j{} 99 neoUrl := neoConnectionString(ip, port) + "/?x-multi-statement=true" 100 d, err := n.Open(neoUrl) 101 if err != nil { 102 t.Fatal(err) 103 } 104 defer func() { 105 if err := d.Close(); err != nil { 106 t.Error(err) 107 } 108 }() 109 m, err := migrate.NewWithDatabaseInstance("file://./examples/migrations", "neo4j", d) 110 if err != nil { 111 t.Fatal(err) 112 } 113 dt.TestMigrate(t, m) 114 }) 115 } 116 117 func TestMalformed(t *testing.T) { 118 dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { 119 ip, port, err := c.Port(7687) 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 n := &Neo4j{} 125 d, err := n.Open(neoConnectionString(ip, port)) 126 if err != nil { 127 t.Fatal(err) 128 } 129 defer func() { 130 if err := d.Close(); err != nil { 131 t.Error(err) 132 } 133 }() 134 135 migration := bytes.NewReader([]byte("CREATE (a {qid: 1) RETURN a")) 136 if err := d.Run(migration); err == nil { 137 t.Fatal("expected failure for malformed migration") 138 } 139 }) 140 }