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  }