go-micro.dev/v5@v5.12.0/store/postgres/postgres_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package postgres
     5  
     6  import (
     7  	"encoding/json"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"go-micro.dev/v5/store"
    12  )
    13  
    14  type testObj struct {
    15  	One string
    16  	Two int64
    17  }
    18  
    19  func TestPostgres(t *testing.T) {
    20  	t.Run("ReadWrite", func(t *testing.T) {
    21  		s := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"))
    22  		base := s.(*sqlStore)
    23  		base.dbConn.Exec("DROP SCHENA IF EXISTS micro")
    24  		b, _ := json.Marshal(testObj{
    25  			One: "1",
    26  			Two: 2,
    27  		})
    28  		err := s.Write(&store.Record{
    29  			Key:   "foobar/baz",
    30  			Value: b,
    31  			Metadata: map[string]interface{}{
    32  				"meta1": "val1",
    33  			},
    34  		})
    35  		assert.NoError(t, err)
    36  		recs, err := s.Read("foobar/baz")
    37  		assert.NoError(t, err)
    38  		assert.Len(t, recs, 1)
    39  		assert.Equal(t, "foobar/baz", recs[0].Key)
    40  		assert.Len(t, recs[0].Metadata, 1)
    41  		assert.Equal(t, "val1", recs[0].Metadata["meta1"])
    42  
    43  		var tobj testObj
    44  		assert.NoError(t, json.Unmarshal(recs[0].Value, &tobj))
    45  		assert.Equal(t, "1", tobj.One)
    46  		assert.Equal(t, int64(2), tobj.Two)
    47  	})
    48  	t.Run("Prefix", func(t *testing.T) {
    49  		s := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"))
    50  		base := s.(*sqlStore)
    51  		base.dbConn.Exec("DROP SCHENA IF EXISTS micro")
    52  		b, _ := json.Marshal(testObj{
    53  			One: "1",
    54  			Two: 2,
    55  		})
    56  		err := s.Write(&store.Record{
    57  			Key:   "foo/bar",
    58  			Value: b,
    59  			Metadata: map[string]interface{}{
    60  				"meta1": "val1",
    61  			},
    62  		})
    63  		assert.NoError(t, err)
    64  		err = s.Write(&store.Record{
    65  			Key:   "foo/baz",
    66  			Value: b,
    67  			Metadata: map[string]interface{}{
    68  				"meta1": "val1",
    69  			},
    70  		})
    71  		assert.NoError(t, err)
    72  		recs, err := s.Read("foo/", store.ReadPrefix())
    73  		assert.NoError(t, err)
    74  		assert.Len(t, recs, 2)
    75  		assert.Equal(t, "foo/bar", recs[0].Key)
    76  		assert.Equal(t, "foo/baz", recs[1].Key)
    77  	})
    78  
    79  	t.Run("MultipleTables", func(t *testing.T) {
    80  		s1 := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"), store.Table("t1"))
    81  		s2 := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"), store.Table("t2"))
    82  		base := s1.(*sqlStore)
    83  		base.dbConn.Exec("DROP SCHENA IF EXISTS t1")
    84  		base.dbConn.Exec("DROP SCHENA IF EXISTS t2")
    85  		b1, _ := json.Marshal(testObj{
    86  			One: "1",
    87  			Two: 2,
    88  		})
    89  		err := s1.Write(&store.Record{
    90  			Key:   "foo/bar",
    91  			Value: b1,
    92  		})
    93  		assert.NoError(t, err)
    94  		b2, _ := json.Marshal(testObj{
    95  			One: "1",
    96  			Two: 2,
    97  		})
    98  		err = s2.Write(&store.Record{
    99  			Key:   "foo/baz",
   100  			Value: b2,
   101  		})
   102  		assert.NoError(t, err)
   103  		recs1, err := s1.List()
   104  		assert.NoError(t, err)
   105  		assert.Len(t, recs1, 1)
   106  		assert.Equal(t, "foo/bar", recs1[0])
   107  
   108  		recs2, err := s2.List()
   109  		assert.NoError(t, err)
   110  		assert.Len(t, recs2, 1)
   111  		assert.Equal(t, "foo/baz", recs2[0])
   112  	})
   113  
   114  	t.Run("MultipleDBs", func(t *testing.T) {
   115  		s1 := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"), store.Database("d1"))
   116  		s2 := NewStore(store.Nodes("postgresql://postgres@localhost:5432/?sslmode=disable"), store.Database("d2"))
   117  		base := s1.(*sqlStore)
   118  		base.dbConn.Exec("DROP DATABASE EXISTS d1")
   119  		base.dbConn.Exec("DROP DATABASE EXISTS d2")
   120  		b1, _ := json.Marshal(testObj{
   121  			One: "1",
   122  			Two: 2,
   123  		})
   124  		err := s1.Write(&store.Record{
   125  			Key:   "foo/bar",
   126  			Value: b1,
   127  		})
   128  		assert.NoError(t, err)
   129  		b2, _ := json.Marshal(testObj{
   130  			One: "1",
   131  			Two: 2,
   132  		})
   133  		err = s2.Write(&store.Record{
   134  			Key:   "foo/baz",
   135  			Value: b2,
   136  		})
   137  		assert.NoError(t, err)
   138  		recs1, err := s1.List()
   139  		assert.NoError(t, err)
   140  		assert.Len(t, recs1, 1)
   141  		assert.Equal(t, "foo/bar", recs1[0])
   142  
   143  		recs2, err := s2.List()
   144  		assert.NoError(t, err)
   145  		assert.Len(t, recs2, 1)
   146  		assert.Equal(t, "foo/baz", recs2[0])
   147  	})
   148  }