func (s *searchRepositoryWhiteboxTest) TestSearchByID() { models.Transactional(s.DB, func(tx *gorm.DB) error { wir := workitem.NewWorkItemRepository(tx) workItem := app.WorkItem{Fields: make(map[string]interface{})} workItem.Fields = map[string]interface{}{ workitem.SystemTitle: "Search Test Sbose", workitem.SystemDescription: rendering.NewMarkupContentFromLegacy("Description"), workitem.SystemCreator: "sbose78", workitem.SystemAssignees: []string{"pranav"}, workitem.SystemState: "closed", } createdWorkItem, err := wir.Create(context.Background(), workitem.SystemBug, workItem.Fields, testsupport.TestIdentity.ID.String()) if err != nil { s.T().Fatalf("Couldn't create test data: %+v", err) } defer wir.Delete(context.Background(), createdWorkItem.ID) // Create a new workitem to have the ID in it's title. This should not come // up in search results workItem.Fields[workitem.SystemTitle] = "Search test sbose " + createdWorkItem.ID _, err = wir.Create(context.Background(), workitem.SystemBug, workItem.Fields, testsupport.TestIdentity.ID.String()) if err != nil { s.T().Fatalf("Couldn't create test data: %+v", err) } sr := NewGormSearchRepository(tx) var start, limit int = 0, 100 searchString := "id:" + createdWorkItem.ID workItemList, _, err := sr.SearchFullText(context.Background(), searchString, &start, &limit) if err != nil { s.T().Fatal("Error gettig search result ", err) } // ID is unique, hence search result set's length should be 1 assert.Equal(s.T(), len(workItemList), 1) for _, workItemValue := range workItemList { s.T().Log("Found search result for ID Search ", workItemValue.ID) assert.Equal(s.T(), createdWorkItem.ID, workItemValue.ID) } return errors.WithStack(err) }) }
// ConvertJSONAPIToWorkItem is responsible for converting given WorkItem model object into a // response resource object by jsonapi.org specifications func ConvertJSONAPIToWorkItem(appl application.Application, source app.WorkItem2, target *app.WorkItem) error { // construct default values from input WI version, err := getVersion(source.Attributes["version"]) if err != nil { return err } target.Version = version if source.Relationships != nil && source.Relationships.Assignees != nil { if source.Relationships.Assignees.Data == nil { delete(target.Fields, workitem.SystemAssignees) } else { var ids []string for _, d := range source.Relationships.Assignees.Data { assigneeUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.assignees.data.id", *d.ID) } if ok := appl.Identities().IsValid(context.Background(), assigneeUUID); !ok { return errors.NewBadParameterError("data.relationships.assignees.data.id", *d.ID) } ids = append(ids, assigneeUUID.String()) } target.Fields[workitem.SystemAssignees] = ids } } if source.Relationships != nil && source.Relationships.Iteration != nil { if source.Relationships.Iteration.Data == nil { delete(target.Fields, workitem.SystemIteration) } else { d := source.Relationships.Iteration.Data iterationUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.iteration.data.id", *d.ID) } if _, err = appl.Iterations().Load(context.Background(), iterationUUID); err != nil { return errors.NewBadParameterError("data.relationships.iteration.data.id", *d.ID) } target.Fields[workitem.SystemIteration] = iterationUUID.String() } } if source.Relationships != nil && source.Relationships.Area != nil { if source.Relationships.Area.Data == nil { delete(target.Fields, workitem.SystemArea) } else { d := source.Relationships.Area.Data areaUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.area.data.id", *d.ID) } if _, err = appl.Areas().Load(context.Background(), areaUUID); err != nil { return errors.NewBadParameterError("data.relationships.area.data.id", *d.ID) } target.Fields[workitem.SystemArea] = areaUUID.String() } } if source.Relationships != nil && source.Relationships.BaseType != nil { if source.Relationships.BaseType.Data != nil { target.Type = source.Relationships.BaseType.Data.ID } } for key, val := range source.Attributes { // convert legacy description to markup content if key == workitem.SystemDescription { if m := rendering.NewMarkupContentFromValue(val); m != nil { target.Fields[key] = *m } } else { target.Fields[key] = val } } if description, ok := target.Fields[workitem.SystemDescription].(rendering.MarkupContent); ok { // verify the description markup if !rendering.IsMarkupSupported(description.Markup) { return errors.NewBadParameterError("data.relationships.attributes[system.description].markup", description.Markup) } } return nil }