Merge branch '15964-fix-docs' refs #15964
[arvados.git] / lib / controller / localdb / login_testuser_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package localdb
6
7 import (
8         "context"
9
10         "git.arvados.org/arvados.git/lib/config"
11         "git.arvados.org/arvados.git/lib/controller/rpc"
12         "git.arvados.org/arvados.git/lib/ctrlctx"
13         "git.arvados.org/arvados.git/sdk/go/arvados"
14         "git.arvados.org/arvados.git/sdk/go/arvadostest"
15         "git.arvados.org/arvados.git/sdk/go/ctxlog"
16         "github.com/jmoiron/sqlx"
17         check "gopkg.in/check.v1"
18 )
19
20 var _ = check.Suite(&TestUserSuite{})
21
22 type TestUserSuite struct {
23         cluster  *arvados.Cluster
24         ctrl     *testLoginController
25         railsSpy *arvadostest.Proxy
26         db       *sqlx.DB
27
28         // transaction context
29         ctx      context.Context
30         rollback func() error
31 }
32
33 func (s *TestUserSuite) SetUpSuite(c *check.C) {
34         cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
35         c.Assert(err, check.IsNil)
36         s.cluster, err = cfg.GetCluster("")
37         c.Assert(err, check.IsNil)
38         s.cluster.Login.Test.Enable = true
39         s.cluster.Login.Test.Users = map[string]arvados.TestUser{
40                 "valid": {Email: "valid@example.com", Password: "v@l1d"},
41         }
42         s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
43         s.ctrl = &testLoginController{
44                 Cluster:    s.cluster,
45                 RailsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider),
46         }
47         s.db = arvadostest.DB(c, s.cluster)
48 }
49
50 func (s *TestUserSuite) SetUpTest(c *check.C) {
51         tx, err := s.db.Beginx()
52         c.Assert(err, check.IsNil)
53         s.ctx = ctrlctx.NewWithTransaction(context.Background(), tx)
54         s.rollback = tx.Rollback
55 }
56
57 func (s *TestUserSuite) TearDownTest(c *check.C) {
58         if s.rollback != nil {
59                 s.rollback()
60         }
61 }
62
63 func (s *TestUserSuite) TestLogin(c *check.C) {
64         for _, trial := range []struct {
65                 success  bool
66                 username string
67                 password string
68         }{
69                 {false, "foo", "bar"},
70                 {false, "", ""},
71                 {false, "valid", ""},
72                 {false, "", "v@l1d"},
73                 {true, "valid", "v@l1d"},
74                 {true, "valid@example.com", "v@l1d"},
75         } {
76                 c.Logf("=== %#v", trial)
77                 resp, err := s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
78                         Username: trial.username,
79                         Password: trial.password,
80                 })
81                 if trial.success {
82                         c.Check(err, check.IsNil)
83                         c.Check(resp.APIToken, check.Not(check.Equals), "")
84                         c.Check(resp.UUID, check.Matches, `zzzzz-gj3su-.*`)
85                         c.Check(resp.Scopes, check.DeepEquals, []string{"all"})
86
87                         authinfo := getCallbackAuthInfo(c, s.railsSpy)
88                         c.Check(authinfo.Email, check.Equals, "valid@example.com")
89                         c.Check(authinfo.AlternateEmails, check.DeepEquals, []string(nil))
90                 } else {
91                         c.Check(err, check.ErrorMatches, `authentication failed.*`)
92                 }
93         }
94 }