|
1 | 1 | package acc |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "database/sql" |
5 | 4 | "fmt" |
6 | | - _ "github.com/lib/pq" |
| 5 | + _ "github.com/microsoft/go-mssqldb" |
7 | 6 | "github.com/nullstone-modules/mss-db-admin/sqlserver" |
8 | | - "github.com/nullstone-modules/mss-db-admin/workflows" |
9 | 7 | "github.com/stretchr/testify/assert" |
10 | 8 | "github.com/stretchr/testify/require" |
11 | 9 | "net/url" |
12 | 10 | "os" |
13 | 11 | "strings" |
14 | 12 | "testing" |
15 | | - "time" |
16 | 13 | ) |
17 | 14 |
|
18 | | -// TestFull tests the entire workflow of create-database, create-user, create-db-access |
| 15 | +// TestFull tests the entire CRUD workflow: |
| 16 | +// create database -> create login -> grant access -> connect as user -> create table -> insert -> query |
19 | 17 | func TestFull(t *testing.T) { |
20 | 18 | if os.Getenv("ACC") != "1" { |
21 | 19 | t.Skip("Set ACC=1 to run e2e tests") |
22 | 20 | } |
23 | 21 |
|
24 | | - connUrl := "postgres://pda:pda@localhost:8432/postgres?sslmode=disable" |
25 | | - db, err := sql.Open("postgres", connUrl) |
26 | | - require.NoError(t, err, "connecting to postgres") |
27 | | - defer db.Close() |
28 | | - appConnUrl := "postgres://test-user:test-password@localhost:8432/test-database?sslmode=disable" |
29 | | - appDb, err := sql.Open("postgres", appConnUrl) |
30 | | - defer appDb.Close() |
31 | | - fmt.Println(appDb.Ping()) |
| 22 | + store := createStore(t) |
32 | 23 |
|
33 | | - newDatabase := sqlserver.Database{ |
34 | | - Name: "test-database", |
35 | | - Owner: "test-database", |
36 | | - } |
37 | | - newUser := sqlserver.Role{ |
38 | | - Name: "test-user", |
39 | | - Password: "test-password", |
40 | | - } |
| 24 | + dbName := "full-test-db" |
| 25 | + loginName := "full-test-user" |
| 26 | + loginPass := "Full!Test0Pass" |
| 27 | + |
| 28 | + // Create the database |
| 29 | + _, err := store.Databases.Create(sqlserver.Database{Name: dbName}) |
| 30 | + require.NoError(t, err, "create database") |
41 | 31 |
|
42 | | - require.NoError(t, workflows.EnsureDatabase(db, newDatabase), "ensure database") |
43 | | - require.NoError(t, workflows.EnsureUser(db, newUser), "ensure user") |
44 | | - require.NoError(t, workflows.GrantDbAccess(db, appDb, newUser, newDatabase), "grant db access") |
| 32 | + // Create the login |
| 33 | + _, err = store.Logins.Create(sqlserver.Login{Name: loginName, Password: loginPass}) |
| 34 | + require.NoError(t, err, "create login") |
45 | 35 |
|
46 | | - time.Sleep(500 * time.Millisecond) |
| 36 | + // Grant access |
| 37 | + _, err = store.DatabaseAccess.Create(sqlserver.DatabaseAccess{Database: dbName, Login: loginName}) |
| 38 | + require.NoError(t, err, "grant database access") |
47 | 39 |
|
48 | | - // Attempt connection to newly-created app db |
49 | | - u, _ := url.Parse(connUrl) |
50 | | - u.Path = "/test-database" |
51 | | - u.User = url.UserPassword(newUser.Name, newUser.Password) |
| 40 | + // Connect as the new user to the app database |
| 41 | + userConnUrl := fmt.Sprintf("sqlserver://%s:%s@localhost:1433?database=%s", |
| 42 | + url.PathEscape(loginName), |
| 43 | + url.PathEscape(loginPass), |
| 44 | + url.PathEscape(dbName), |
| 45 | + ) |
| 46 | + userDb, err := sqlserver.OpenDatabase(userConnUrl, "") |
| 47 | + require.NoError(t, err, "connecting as app user") |
| 48 | + defer userDb.Close() |
52 | 49 |
|
53 | | - // Attempt to create schema objects |
54 | | - _, err = appDb.Exec("CREATE TABLE todos ( id SERIAL NOT NULL, name varchar(255) );") |
| 50 | + // Create a table |
| 51 | + _, err = userDb.Exec("CREATE TABLE todos ( id INT IDENTITY(1,1) NOT NULL, name varchar(255) );") |
55 | 52 | require.NoError(t, err, "create table") |
56 | 53 |
|
57 | | - // Attempt to insert records |
| 54 | + // Insert records |
58 | 55 | sq := strings.Join([]string{ |
59 | 56 | `INSERT INTO todos (name) VALUES ('item1');`, |
60 | 57 | `INSERT INTO todos (name) VALUES ('item2');`, |
61 | 58 | `INSERT INTO todos (name) VALUES ('item3');`, |
62 | | - }, "") |
63 | | - _, err = appDb.Exec(sq) |
| 59 | + }, " ") |
| 60 | + _, err = userDb.Exec(sq) |
64 | 61 | require.NoError(t, err, "insert todos") |
65 | 62 |
|
66 | | - // Attempt to retrieve them |
| 63 | + // Query records |
67 | 64 | results := make([]string, 0) |
68 | | - rows, err := appDb.Query(`SELECT * FROM todos`) |
| 65 | + rows, err := userDb.Query(`SELECT id, name FROM todos ORDER BY id`) |
69 | 66 | require.NoError(t, err, "query todos") |
70 | 67 | defer rows.Close() |
71 | 68 | for rows.Next() { |
|
0 commit comments