func CreateGroupInMongo(groupName string, socialapiId int64) (*kodingmodels.Group, error) { g := &kodingmodels.Group{ Id: bson.NewObjectId(), Body: groupName, Title: groupName, Slug: groupName, Privacy: "private", Visibility: "hidden", SocialApiChannelId: strconv.FormatInt(socialapiId, 10), SocialApiAnnouncementChannelId: strconv.FormatInt(socialapiId, 10), } return g, modelhelper.CreateGroup(g) }
func createGroup() (*models.Group, error) { g := &models.Group{ Id: bson.NewObjectId(), Body: bson.NewObjectId().Hex(), Title: bson.NewObjectId().Hex(), Slug: bson.NewObjectId().Hex(), Privacy: "private", Visibility: "hidden", SocialApiChannelId: "0", SocialApiAnnouncementChannelId: "0", // DefaultChannels holds the default channels for a group, when a user joins // to this group, participants will be automatically added to regarding // channels DefaultChannels: []string{"0"}, } return g, modelhelper.CreateGroup(g) }
func TestTeam(t *testing.T) { r := runner.New("test") if err := r.Init(); err != nil { t.Fatalf("couldnt start bongo %s", err.Error()) } defer r.Close() appConfig := config.MustRead(r.Conf.Path) // init mongo connection modelhelper.Initialize(appConfig.Mongo) defer modelhelper.Close() handler := NewController(r.Log, appConfig) Convey("given a group", t, func() { // create admin admin, err := models.CreateAccountInBothDbsWithNick("sinan") So(err, ShouldBeNil) So(admin, ShouldNotBeNil) acc1, err := models.CreateAccountInBothDbs() So(err, ShouldBeNil) So(acc1, ShouldNotBeNil) // create another account acc2, err := models.CreateAccountInBothDbs() So(err, ShouldBeNil) So(acc2, ShouldNotBeNil) groupName := models.RandomGroupName() groupChannel := models.CreateTypedGroupedChannelWithTest(admin.Id, models.Channel_TYPE_GROUP, groupName) So(groupChannel, ShouldNotBeNil) defaultChannel1 := models.CreateTypedGroupedChannelWithTest(admin.Id, models.Channel_TYPE_TOPIC, groupName) So(defaultChannel1, ShouldNotBeNil) defaultChannel2 := models.CreateTypedGroupedChannelWithTest(admin.Id, models.Channel_TYPE_TOPIC, groupName) So(defaultChannel2, ShouldNotBeNil) group := &mongomodels.Group{ Id: bson.NewObjectId(), Body: groupName, Title: groupName, Slug: groupName, Privacy: "private", Visibility: "hidden", SocialApiChannelId: strconv.FormatInt(groupChannel.Id, 10), DefaultChannels: []string{ strconv.FormatInt(defaultChannel1.Id, 10), strconv.FormatInt(defaultChannel2.Id, 10), }, } err = modelhelper.CreateGroup(group) So(err, ShouldBeNil) Convey("should success if channel is not in db", func() { cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: math.MaxInt64, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) }) Convey("should success if channel is not a group channel", func() { cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: defaultChannel1.Id, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) }) Convey("should success if group is not in mongo", func() { groupName := models.RandomGroupName() groupChan := models.CreateTypedGroupedChannelWithTest(admin.Id, models.Channel_TYPE_GROUP, groupName) So(groupChan, ShouldNotBeNil) cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: groupChan.Id, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) }) Convey("new participant should be in default channels", func() { cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: groupChannel.Id, StatusConstant: models.ChannelParticipant_STATUS_ACTIVE, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) isParticipant, err := defaultChannel1.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeTrue) isParticipant, err = defaultChannel2.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeTrue) Convey("after leaving group channel", func() { cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: groupChannel.Id, StatusConstant: models.ChannelParticipant_STATUS_LEFT, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) Convey("should be removed from default channels", func() { isParticipant, err := defaultChannel1.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeFalse) isParticipant, err = defaultChannel2.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeFalse) }) Convey("should be removed from all channels", func() { ids, err := cp.FetchAllParticipatedChannelIdsInGroup(cp.AccountId, groupChannel.GroupName) So(err, ShouldBeNil) So(len(ids), ShouldEqual, 0) }) }) Convey("after being blocked", func() { cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: groupChannel.Id, StatusConstant: models.ChannelParticipant_STATUS_BLOCKED, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) Convey("should be removed from default channels", func() { isParticipant, err := defaultChannel1.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeFalse) isParticipant, err = defaultChannel2.IsParticipant(acc1.Id) So(err, ShouldBeNil) So(isParticipant, ShouldBeFalse) }) }) }) Convey("should success if default channels is not available anymore", func() { // delete the channel So(defaultChannel1.Delete(), ShouldBeNil) cp := &models.ChannelParticipant{ AccountId: acc1.Id, ChannelId: groupChannel.Id, StatusConstant: models.ChannelParticipant_STATUS_ACTIVE, } err := handler.HandleParticipant(cp) So(err, ShouldBeNil) }) }) }
func CreateUser(opts *UserOptions) (*User, error) { username := opts.Username groupname := opts.Groupname provider := opts.Provider template := opts.Template privateKey, publicKey, err := sshutil.TemporaryKey() if err != nil { return nil, err } labels, err := machineLabels([]byte(template)) if err != nil { return nil, err } relationExists := true // jAccounts account, err := modelhelper.GetAccount(username) if err == mgo.ErrNotFound { relationExists = false account = &models.Account{ Id: bson.NewObjectId(), Profile: models.AccountProfile{ Nickname: username, }, } err = modelhelper.CreateAccount(account) } if err != nil { return nil, errors.New("failure looking up jAccounts: " + err.Error()) } // jGroups group, err := modelhelper.GetGroup(groupname) if err == mgo.ErrNotFound { relationExists = false group = &models.Group{ Id: bson.NewObjectId(), Title: groupname, Slug: groupname, } err = modelhelper.CreateGroup(group) } if err != nil { return nil, errors.New("failure looking up jGroups: " + err.Error()) } if !relationExists { // add relation between use and group relationship := &models.Relationship{ Id: bson.NewObjectId(), TargetId: account.Id, TargetName: "JAccount", SourceId: group.Id, SourceName: "JGroup", As: "member", } err := modelhelper.AddRelationship(relationship) if err != nil { return nil, errors.New("failure insering relationship: " + err.Error()) } } // jUsers user, err := modelhelper.GetUser(username) if err == nil && len(user.SshKeys) != 0 { publicKey = user.SshKeys[0].Key } if err == mgo.ErrNotFound { user = &models.User{ ObjectId: bson.NewObjectId(), Email: username + "@" + username + ".com", LastLoginDate: time.Now().UTC(), RegisteredAt: time.Now().UTC(), Name: username, // bson equivelant is username Password: "******", Status: "confirmed", SshKeys: []struct { Title string `bson:"title"` Key string `bson:"key"` }{ {Key: publicKey}, }, } err = modelhelper.CreateUser(user) } if err != nil { return nil, errors.New("failure looking up jUsers: " + err.Error()) } queryString := protocol.Kite{ID: opts.KlientID}.String() cred := &models.Credential{ Id: bson.NewObjectId(), Provider: opts.Provider, Identifier: bson.NewObjectId().Hex(), OriginId: account.Id, } credData := &models.CredentialData{ Id: bson.NewObjectId(), Identifier: cred.Identifier, OriginId: account.Id, Meta: bson.M{ "queryString": queryString, "memory": 0, "cpu": 0, "box": "", }, } if err := modelhelper.InsertCredential(cred, credData); err != nil { return nil, err } relationship := &models.Relationship{ Id: bson.NewObjectId(), TargetId: cred.Id, TargetName: "JCredential", SourceId: account.Id, SourceName: "JAccount", As: "owner", } if err := modelhelper.AddRelationship(relationship); err != nil { return nil, err } // jComputeStack and jStackTemplates stackTemplateId := bson.NewObjectId() stackTemplate := &models.StackTemplate{ Id: stackTemplateId, Credentials: map[string][]string{ "vagrant": {cred.Identifier}, }, } stackTemplate.Template.Content = template if err := modelhelper.CreateStackTemplate(stackTemplate); err != nil { return nil, err } // later we can add more users with "Owner:false" to test sharing capabilities users := []models.MachineUser{ {Id: user.ObjectId, Sudo: true, Owner: true}, } machineIds := make([]bson.ObjectId, len(labels)) for i, label := range labels { machineId := bson.NewObjectId() machine := &models.Machine{ ObjectId: machineId, Label: label, Domain: username + ".dev.koding.io", Provider: provider, CreatedAt: time.Now().UTC(), Users: users, Meta: make(bson.M, 0), Groups: make([]models.MachineGroup, 0), Credential: username, } machine.Assignee.InProgress = false machine.Assignee.AssignedAt = time.Now().UTC() machine.Status.State = machinestate.NotInitialized.String() machine.Status.ModifiedAt = time.Now().UTC() machineIds[i] = machine.ObjectId if err := modelhelper.CreateMachine(machine); err != nil { return nil, err } } computeStackID := bson.NewObjectId() computeStack := &models.ComputeStack{ Id: computeStackID, BaseStackId: stackTemplateId, Machines: machineIds, } if err := modelhelper.CreateComputeStack(computeStack); err != nil { return nil, err } return &User{ MachineIDs: machineIds, MachineLabels: labels, StackID: computeStackID.Hex(), StackTemplateID: stackTemplate.Id.Hex(), AccountID: account.Id, CredID: cred.Id.Hex(), CredDataID: credData.Id.Hex(), PrivateKey: privateKey, PublicKey: publicKey, Identifiers: []string{cred.Identifier}, }, nil }