|
1 | 1 | package cmd |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "os" |
4 | 5 | "path/filepath" |
5 | 6 | "testing" |
6 | 7 |
|
@@ -69,6 +70,9 @@ func TestImportCmd(t *testing.T) { |
69 | 70 | }() |
70 | 71 | conn, err := srv.GRPCDialContext(ctx) |
71 | 72 | require.NoError(err) |
| 73 | + t.Cleanup(func() { |
| 74 | + conn.Close() |
| 75 | + }) |
72 | 76 |
|
73 | 77 | c, err := zedtesting.ClientFromConn(conn)(cmd) |
74 | 78 | require.NoError(err) |
@@ -98,3 +102,80 @@ func TestImportCmd(t *testing.T) { |
98 | 102 | }) |
99 | 103 | } |
100 | 104 | } |
| 105 | + |
| 106 | +func TestImportCmdRelationsOnly(t *testing.T) { |
| 107 | + cmd := zedtesting.CreateTestCobraCommandWithFlagValue(t, |
| 108 | + zedtesting.StringFlag{FlagName: "schema-definition-prefix"}, |
| 109 | + zedtesting.BoolFlag{FlagName: "schema", FlagValue: false}, |
| 110 | + zedtesting.BoolFlag{FlagName: "relationships", FlagValue: true}, |
| 111 | + zedtesting.IntFlag{FlagName: "batch-size", FlagValue: 100}, |
| 112 | + zedtesting.IntFlag{FlagName: "workers", FlagValue: 1}, |
| 113 | + ) |
| 114 | + |
| 115 | + // Set up client |
| 116 | + ctx := t.Context() |
| 117 | + srv := zedtesting.NewTestServer(ctx, t) |
| 118 | + go func() { |
| 119 | + assert.NoError(t, srv.Run(ctx)) |
| 120 | + }() |
| 121 | + conn, err := srv.GRPCDialContext(ctx) |
| 122 | + require.NoError(t, err) |
| 123 | + t.Cleanup(func() { |
| 124 | + conn.Close() |
| 125 | + }) |
| 126 | + |
| 127 | + c, err := zedtesting.ClientFromConn(conn)(cmd) |
| 128 | + require.NoError(t, err) |
| 129 | + |
| 130 | + // Write the schema out-of-band so that the import is hitting a realized schema |
| 131 | + schemaBytes, err := os.ReadFile(filepath.Join("import-test", "relations-only-schema.zed")) |
| 132 | + require.NoError(t, err) |
| 133 | + _, err = c.WriteSchema(ctx, &v1.WriteSchemaRequest{ |
| 134 | + Schema: string(schemaBytes), |
| 135 | + }) |
| 136 | + require.NoError(t, err) |
| 137 | + |
| 138 | + t.Run("with no schema or schemaFile key in yaml", func(t *testing.T) { |
| 139 | + f := filepath.Join("import-test", "relations-only-validation-file.yaml") |
| 140 | + err = importCmdFunc(cmd, c, c, "", f) |
| 141 | + require.NoError(t, err) |
| 142 | + |
| 143 | + // Run a check with full consistency to see whether the relationships were written |
| 144 | + resp, err := c.CheckPermission(ctx, &v1.CheckPermissionRequest{ |
| 145 | + Consistency: fullyConsistent, |
| 146 | + Subject: &v1.SubjectReference{Object: &v1.ObjectReference{ObjectType: "user", ObjectId: "1"}}, |
| 147 | + Permission: "view", |
| 148 | + Resource: &v1.ObjectReference{ObjectType: "resource", ObjectId: "1"}, |
| 149 | + }) |
| 150 | + require.NoError(t, err) |
| 151 | + require.Equal(t, v1.CheckPermissionResponse_PERMISSIONSHIP_HAS_PERMISSION, resp.Permissionship) |
| 152 | + |
| 153 | + // Run a ReadSchema to assert the schema was NOT written |
| 154 | + schemaResp, err := c.ReadSchema(ctx, &v1.ReadSchemaRequest{}) |
| 155 | + require.NoError(t, err) |
| 156 | + require.Contains(t, schemaResp.SchemaText, `relation user: user`) |
| 157 | + require.Contains(t, schemaResp.SchemaText, `permission view = user`) |
| 158 | + }) |
| 159 | + t.Run("with schema present should be ignored", func(t *testing.T) { |
| 160 | + f := filepath.Join("import-test", "relations-only-validation-file-different-schema.yaml") |
| 161 | + err = importCmdFunc(cmd, c, c, "", f) |
| 162 | + require.NoError(t, err) |
| 163 | + |
| 164 | + // Run a check with full consistency to see whether the relationships |
| 165 | + // and schema are written |
| 166 | + resp, err := c.CheckPermission(ctx, &v1.CheckPermissionRequest{ |
| 167 | + Consistency: fullyConsistent, |
| 168 | + Subject: &v1.SubjectReference{Object: &v1.ObjectReference{ObjectType: "user", ObjectId: "1"}}, |
| 169 | + Permission: "view", |
| 170 | + Resource: &v1.ObjectReference{ObjectType: "resource", ObjectId: "1"}, |
| 171 | + }) |
| 172 | + require.NoError(t, err) |
| 173 | + require.Equal(t, v1.CheckPermissionResponse_PERMISSIONSHIP_HAS_PERMISSION, resp.Permissionship) |
| 174 | + |
| 175 | + // Run a ReadSchema to assert the schema was NOT written |
| 176 | + schemaResp, err := c.ReadSchema(ctx, &v1.ReadSchemaRequest{}) |
| 177 | + require.NoError(t, err) |
| 178 | + require.Contains(t, schemaResp.SchemaText, `relation user: user`) |
| 179 | + require.Contains(t, schemaResp.SchemaText, `permission view = user`) |
| 180 | + }) |
| 181 | +} |
0 commit comments