github.com/cs3org/reva/v2@v2.27.7/pkg/group/manager/json/json_test.go (about)

     1  // Copyright 2018-2020 CERN
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  // In applying this license, CERN does not waive the privileges and immunities
    16  // granted to it by virtue of its status as an Intergovernmental Organization
    17  // or submit itself to any jurisdiction.
    18  
    19  package json
    20  
    21  import (
    22  	"context"
    23  	"os"
    24  	"reflect"
    25  	"testing"
    26  
    27  	grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1"
    28  	userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
    29  	"github.com/cs3org/reva/v2/pkg/errtypes"
    30  	"github.com/google/go-cmp/cmp"
    31  	"google.golang.org/protobuf/proto"
    32  	"google.golang.org/protobuf/testing/protocmp"
    33  )
    34  
    35  var ctx = context.Background()
    36  
    37  func TestUserManager(t *testing.T) {
    38  	// add tempdir
    39  	tempdir, err := os.MkdirTemp("", "json_test")
    40  	if err != nil {
    41  		t.Fatalf("error while create temp dir: %v", err)
    42  	}
    43  	defer os.RemoveAll(tempdir)
    44  
    45  	// corrupt json object with user meta data
    46  	userJSON := `[{`
    47  
    48  	// get file handler for temporary file
    49  	file, err := os.CreateTemp(tempdir, "json_test")
    50  	if err != nil {
    51  		t.Fatalf("error while open temp file: %v", err)
    52  	}
    53  
    54  	// write json object to tempdir
    55  	_, err = file.WriteString(userJSON)
    56  	if err != nil {
    57  		t.Fatalf("error while writing temp file: %v", err)
    58  	}
    59  
    60  	// get manager
    61  	input := map[string]interface{}{
    62  		"groups": file.Name(),
    63  	}
    64  	_, err = New(input)
    65  	if err == nil {
    66  		t.Fatalf("no error (but we expected one) while get manager")
    67  	}
    68  
    69  	// clean up
    70  	os.Remove(file.Name())
    71  
    72  	// json object with user meta data
    73  	userJSON = `[{"id":{"opaque_id":"sailing-lovers"},"group_name":"sailing-lovers","mail":"sailing-lovers@example.org","display_name":"Sailing Lovers","gid_number":1234,"members":[{"idp":"localhost","opaque_id":"einstein","type":1},{"idp":"localhost","opaque_id":"marie","type":1}]}]`
    74  
    75  	// get file handler for temporary file
    76  	file, err = os.CreateTemp(tempdir, "json_test")
    77  	if err != nil {
    78  		t.Fatalf("error while open temp file: %v", err)
    79  	}
    80  	defer os.Remove(file.Name())
    81  
    82  	// write json object to tempdir
    83  	_, err = file.WriteString(userJSON)
    84  	if err != nil {
    85  		t.Fatalf("error while writing temp file: %v", err)
    86  	}
    87  
    88  	// get manager - positive test
    89  	input = map[string]interface{}{
    90  		"groups": file.Name(),
    91  	}
    92  	manager, _ := New(input)
    93  
    94  	// setup test data
    95  	gid := &grouppb.GroupId{OpaqueId: "sailing-lovers"}
    96  	uidEinstein := &userpb.UserId{Idp: "localhost", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_PRIMARY}
    97  	uidMarie := &userpb.UserId{Idp: "localhost", OpaqueId: "marie", Type: userpb.UserType_USER_TYPE_PRIMARY}
    98  	members := []*userpb.UserId{uidEinstein, uidMarie}
    99  	group := &grouppb.Group{
   100  		Id:          gid,
   101  		GroupName:   "sailing-lovers",
   102  		Mail:        "sailing-lovers@example.org",
   103  		GidNumber:   1234,
   104  		DisplayName: "Sailing Lovers",
   105  		Members:     members,
   106  	}
   107  	groupWithoutMembers := &grouppb.Group{
   108  		Id:          gid,
   109  		GroupName:   "sailing-lovers",
   110  		Mail:        "sailing-lovers@example.org",
   111  		GidNumber:   1234,
   112  		DisplayName: "Sailing Lovers",
   113  	}
   114  	groupFake := &grouppb.GroupId{OpaqueId: "fake-group"}
   115  
   116  	// positive test GetGroup
   117  	resGroup, _ := manager.GetGroup(ctx, gid, false)
   118  	if !proto.Equal(resGroup, group) {
   119  		t.Fatalf("group differs: expected=%v got=%v", group, resGroup)
   120  	}
   121  
   122  	// positive test GetGroup without members
   123  	resGroupWithoutMembers, _ := manager.GetGroup(ctx, gid, true)
   124  	if !proto.Equal(resGroupWithoutMembers, groupWithoutMembers) {
   125  		t.Fatalf("group differs: expected=%v got=%v", groupWithoutMembers, resGroupWithoutMembers)
   126  	}
   127  
   128  	// negative test GetGroup
   129  	expectedErr := errtypes.NotFound(groupFake.OpaqueId)
   130  	_, err = manager.GetGroup(ctx, groupFake, false)
   131  	if !reflect.DeepEqual(err, expectedErr) {
   132  		t.Fatalf("group not found error differ: expected='%v' got='%v'", expectedErr, err)
   133  	}
   134  
   135  	// positive test GetGroupByClaim by mail
   136  	resGroupByEmail, _ := manager.GetGroupByClaim(ctx, "mail", "sailing-lovers@example.org", false)
   137  	if !proto.Equal(resGroupByEmail, group) {
   138  		t.Fatalf("group differs: expected=%v got=%v", group, resGroupByEmail)
   139  	}
   140  
   141  	// negative test GetGroupByClaim by mail
   142  	expectedErr = errtypes.NotFound("abc@example.com")
   143  	_, err = manager.GetGroupByClaim(ctx, "mail", "abc@example.com", false)
   144  	if !reflect.DeepEqual(err, expectedErr) {
   145  		t.Fatalf("group not found error differs: expected='%v' got='%v'", expectedErr, err)
   146  	}
   147  
   148  	// test GetMembers
   149  	resMembers, _ := manager.GetMembers(ctx, gid)
   150  	if !cmp.Equal(resMembers, members, protocmp.Transform()) {
   151  		t.Fatalf("members differ: expected=%v got=%v", members, resMembers)
   152  	}
   153  
   154  	// positive test HasMember
   155  	resMember, _ := manager.HasMember(ctx, gid, uidMarie)
   156  	if resMember != true {
   157  		t.Fatalf("result differs: expected=%v got=%v", true, resMember)
   158  	}
   159  
   160  	// negative test HasMember
   161  	resMemberNegative, _ := manager.HasMember(ctx, gid, &userpb.UserId{Idp: "localhost", OpaqueId: "fake-user", Type: userpb.UserType_USER_TYPE_PRIMARY})
   162  	if resMemberNegative != false {
   163  		t.Fatalf("result differs: expected=%v got=%v", false, resMemberNegative)
   164  	}
   165  
   166  	// test FindGroups
   167  	resFind, _ := manager.FindGroups(ctx, "sail", false)
   168  	if len(resFind) != 1 {
   169  		t.Fatalf("too many groups found: expected=%d got=%d", 1, len(resFind))
   170  	}
   171  	if !reflect.DeepEqual(resFind[0].GroupName, "sailing-lovers") {
   172  		t.Fatalf("group differ: expected=%v got=%v", "sailing-lovers", resFind[0].GroupName)
   173  	}
   174  }