github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/api/fixtures_test.go (about)

     1  package api_test
     2  
     3  import (
     4  	"database/sql"
     5  	"database/sql/driver"
     6  	"encoding/json"
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/kyma-incubator/compass/components/director/pkg/str"
    11  
    12  	"github.com/kyma-incubator/compass/components/director/internal/domain/version"
    13  
    14  	"github.com/kyma-incubator/compass/components/director/internal/domain/api"
    15  	"github.com/kyma-incubator/compass/components/director/internal/repo"
    16  
    17  	"github.com/kyma-incubator/compass/components/director/internal/model"
    18  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
    19  )
    20  
    21  const (
    22  	apiDefID         = "ddddddddd-dddd-dddd-dddd-dddddddddddd"
    23  	specID           = "sssssssss-ssss-ssss-ssss-ssssssssssss"
    24  	tenantID         = "b91b59f7-2563-40b2-aba9-fef726037aa3"
    25  	externalTenantID = "eeeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee"
    26  	bundleID         = "bbbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
    27  	packageID        = "ppppppppp-pppp-pppp-pppp-pppppppppppp"
    28  	ordID            = "com.compass.ord.v1"
    29  	localTenantID    = "localTenantID"
    30  	extensible       = `{"supported":"automatic","description":"Please find the extensibility documentation"}`
    31  	successors       = `["sap.s4:apiResource:API_BILL_OF_MATERIAL_SRV:v2"]`
    32  	resourceHash     = "123456"
    33  	publicVisibility = "public"
    34  	targetURL        = "https://test-url.com/api"
    35  
    36  	firstTargetURL  = "https://test-url.com"
    37  	secondTargetURL = "https://test2-url.com"
    38  )
    39  
    40  var (
    41  	fixedTimestamp       = time.Now()
    42  	firstBundleID        = "id1"
    43  	secondBundleID       = "id2"
    44  	thirdBundleID        = "id3"
    45  	frURL                = "foo.bar"
    46  	spec                 = "spec"
    47  	appID                = "aaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    48  	appTemplateVersionID = "fffffffff-ffff-aaaa-ffff-aaaaaaaaaaaa"
    49  )
    50  
    51  func fixAPIDefinitionModel(id string, name, targetURL string) *model.APIDefinition {
    52  	return &model.APIDefinition{
    53  		Name:       name,
    54  		TargetURLs: api.ConvertTargetURLToJSONArray(targetURL),
    55  		BaseEntity: &model.BaseEntity{ID: id},
    56  		Visibility: str.Ptr(publicVisibility),
    57  	}
    58  }
    59  
    60  func fixAPIDefinitionWithPackageModel(id, name string) *model.APIDefinition {
    61  	return &model.APIDefinition{
    62  		PackageID:  str.Ptr(packageID),
    63  		Name:       name,
    64  		TargetURLs: api.ConvertTargetURLToJSONArray(targetURL),
    65  		Version:    &model.Version{},
    66  		BaseEntity: &model.BaseEntity{
    67  			ID:    id,
    68  			Ready: true,
    69  		},
    70  	}
    71  }
    72  
    73  func fixFullAPIDefinitionModelWithAppID(placeholder string) (model.APIDefinition, model.Spec, model.BundleReference) {
    74  	apiDef, spec, bundleRef := fixFullAPIDefinitionModel(apiDefID, placeholder)
    75  	apiDef.ApplicationID = str.Ptr(appID)
    76  
    77  	return apiDef, spec, bundleRef
    78  }
    79  
    80  func fixFullAPIDefinitionModelWithAppTemplateVersionID(placeholder string) (model.APIDefinition, model.Spec, model.BundleReference) {
    81  	apiDef, spec, bundleRef := fixFullAPIDefinitionModel(apiDefID, placeholder)
    82  	apiDef.ApplicationTemplateVersionID = str.Ptr(appTemplateVersionID)
    83  
    84  	return apiDef, spec, bundleRef
    85  }
    86  
    87  func fixFullAPIDefinitionModel(apiDefID, placeholder string) (model.APIDefinition, model.Spec, model.BundleReference) {
    88  	apiType := model.APISpecTypeOpenAPI
    89  	spec := model.Spec{
    90  		ID:         specID,
    91  		Data:       str.Ptr("spec_data_" + placeholder),
    92  		Format:     model.SpecFormatYaml,
    93  		ObjectType: model.APISpecReference,
    94  		ObjectID:   apiDefID,
    95  		APIType:    &apiType,
    96  	}
    97  
    98  	deprecated := false
    99  	forRemoval := false
   100  
   101  	v := &model.Version{
   102  		Value:           "v1.1",
   103  		Deprecated:      &deprecated,
   104  		DeprecatedSince: str.Ptr("v1.0"),
   105  		ForRemoval:      &forRemoval,
   106  	}
   107  
   108  	apiBundleReference := model.BundleReference{
   109  		BundleID:            str.Ptr(bundleID),
   110  		ObjectType:          model.BundleAPIReference,
   111  		ObjectID:            str.Ptr(apiDefID),
   112  		APIDefaultTargetURL: str.Ptr(fmt.Sprintf("https://%s.com", placeholder)),
   113  	}
   114  
   115  	boolVar := false
   116  	return model.APIDefinition{
   117  		PackageID:                               str.Ptr(packageID),
   118  		Name:                                    placeholder,
   119  		Description:                             str.Ptr("desc_" + placeholder),
   120  		TargetURLs:                              api.ConvertTargetURLToJSONArray(fmt.Sprintf("https://%s.com", placeholder)),
   121  		Group:                                   str.Ptr("group_" + placeholder),
   122  		OrdID:                                   str.Ptr(ordID),
   123  		LocalTenantID:                           str.Ptr(localTenantID),
   124  		ShortDescription:                        str.Ptr("shortDescription"),
   125  		SystemInstanceAware:                     &boolVar,
   126  		PolicyLevel:                             nil,
   127  		CustomPolicyLevel:                       nil,
   128  		APIProtocol:                             str.Ptr("apiProtocol"),
   129  		Tags:                                    json.RawMessage("[]"),
   130  		Countries:                               json.RawMessage("[]"),
   131  		Links:                                   json.RawMessage("[]"),
   132  		APIResourceLinks:                        json.RawMessage("[]"),
   133  		ReleaseStatus:                           str.Ptr("releaseStatus"),
   134  		SunsetDate:                              str.Ptr("sunsetDate"),
   135  		Successors:                              json.RawMessage(successors),
   136  		ChangeLogEntries:                        json.RawMessage("[]"),
   137  		Labels:                                  json.RawMessage("[]"),
   138  		Visibility:                              str.Ptr(publicVisibility),
   139  		Disabled:                                &boolVar,
   140  		PartOfProducts:                          json.RawMessage("[]"),
   141  		LineOfBusiness:                          json.RawMessage("[]"),
   142  		Industry:                                json.RawMessage("[]"),
   143  		ImplementationStandard:                  str.Ptr("implementationStandard"),
   144  		CustomImplementationStandard:            str.Ptr("customImplementationStandard"),
   145  		CustomImplementationStandardDescription: str.Ptr("customImplementationStandardDescription"),
   146  		Version:                                 v,
   147  		Extensible:                              json.RawMessage(extensible),
   148  		ResourceHash:                            str.Ptr(resourceHash),
   149  		Hierarchy:                               json.RawMessage("[]"),
   150  		SupportedUseCases:                       json.RawMessage("[]"),
   151  		DocumentationLabels:                     json.RawMessage("[]"),
   152  		BaseEntity: &model.BaseEntity{
   153  			ID:        apiDefID,
   154  			Ready:     true,
   155  			CreatedAt: &fixedTimestamp,
   156  			UpdatedAt: &time.Time{},
   157  			DeletedAt: &time.Time{},
   158  			Error:     nil,
   159  		},
   160  	}, spec, apiBundleReference
   161  }
   162  
   163  func fixFullGQLAPIDefinition(placeholder string) *graphql.APIDefinition {
   164  	data := graphql.CLOB("spec_data_" + placeholder)
   165  
   166  	spec := &graphql.APISpec{
   167  		Data:         &data,
   168  		Format:       graphql.SpecFormatYaml,
   169  		Type:         graphql.APISpecTypeOpenAPI,
   170  		DefinitionID: apiDefID,
   171  	}
   172  
   173  	deprecated := false
   174  	forRemoval := false
   175  
   176  	v := &graphql.Version{
   177  		Value:           "v1.1",
   178  		Deprecated:      &deprecated,
   179  		DeprecatedSince: str.Ptr("v1.0"),
   180  		ForRemoval:      &forRemoval,
   181  	}
   182  
   183  	return &graphql.APIDefinition{
   184  		BundleID:    bundleID,
   185  		Name:        placeholder,
   186  		Description: str.Ptr("desc_" + placeholder),
   187  		Spec:        spec,
   188  		TargetURL:   fmt.Sprintf("https://%s.com", placeholder),
   189  		Group:       str.Ptr("group_" + placeholder),
   190  		Version:     v,
   191  		BaseEntity: &graphql.BaseEntity{
   192  			ID:        apiDefID,
   193  			Ready:     true,
   194  			Error:     nil,
   195  			CreatedAt: timeToTimestampPtr(fixedTimestamp),
   196  			UpdatedAt: timeToTimestampPtr(time.Time{}),
   197  			DeletedAt: timeToTimestampPtr(time.Time{}),
   198  		},
   199  	}
   200  }
   201  
   202  func fixModelAPIDefinitionInput(name, description string, group string) (*model.APIDefinitionInput, *model.SpecInput) {
   203  	data := "data"
   204  	apiType := model.APISpecTypeOpenAPI
   205  
   206  	spec := &model.SpecInput{
   207  		Data:         &data,
   208  		APIType:      &apiType,
   209  		Format:       model.SpecFormatYaml,
   210  		FetchRequest: &model.FetchRequestInput{},
   211  	}
   212  
   213  	deprecated := false
   214  	deprecatedSince := ""
   215  	forRemoval := false
   216  
   217  	v := &model.VersionInput{
   218  		Value:           "1.0.0",
   219  		Deprecated:      &deprecated,
   220  		DeprecatedSince: &deprecatedSince,
   221  		ForRemoval:      &forRemoval,
   222  	}
   223  
   224  	return &model.APIDefinitionInput{
   225  		Name:         name,
   226  		Description:  &description,
   227  		TargetURLs:   api.ConvertTargetURLToJSONArray(targetURL),
   228  		Group:        &group,
   229  		VersionInput: v,
   230  	}, spec
   231  }
   232  
   233  func fixGQLAPIDefinitionInput(name, description string, group string) *graphql.APIDefinitionInput {
   234  	data := graphql.CLOB("data")
   235  
   236  	spec := &graphql.APISpecInput{
   237  		Data:         &data,
   238  		Type:         graphql.APISpecTypeOpenAPI,
   239  		Format:       graphql.SpecFormatYaml,
   240  		FetchRequest: &graphql.FetchRequestInput{},
   241  	}
   242  
   243  	deprecated := false
   244  	deprecatedSince := ""
   245  	forRemoval := false
   246  
   247  	v := &graphql.VersionInput{
   248  		Value:           "1.0.0",
   249  		Deprecated:      &deprecated,
   250  		DeprecatedSince: &deprecatedSince,
   251  		ForRemoval:      &forRemoval,
   252  	}
   253  
   254  	return &graphql.APIDefinitionInput{
   255  		Name:        name,
   256  		Description: &description,
   257  		TargetURL:   targetURL,
   258  		Group:       &group,
   259  		Spec:        spec,
   260  		Version:     v,
   261  	}
   262  }
   263  
   264  func fixEntityAPIDefinition(id string, name, targetURL string) *api.Entity {
   265  	return &api.Entity{
   266  		Name:       name,
   267  		TargetURLs: repo.NewValidNullableString(`["` + targetURL + `"]`),
   268  		BaseEntity: &repo.BaseEntity{ID: id},
   269  		Visibility: publicVisibility,
   270  	}
   271  }
   272  
   273  func fixFullEntityAPIDefinitionWithAppID(apiDefID, placeholder string) api.Entity {
   274  	entity := fixFullEntityAPIDefinition(apiDefID, placeholder)
   275  	entity.ApplicationID = repo.NewValidNullableString(appID)
   276  
   277  	return entity
   278  }
   279  
   280  func fixFullEntityAPIDefinitionWithAppTemplateVersionID(apiDefID, placeholder string) api.Entity {
   281  	entity := fixFullEntityAPIDefinition(apiDefID, placeholder)
   282  	entity.ApplicationTemplateVersionID = repo.NewValidNullableString(appTemplateVersionID)
   283  
   284  	return entity
   285  }
   286  
   287  func fixFullEntityAPIDefinition(apiDefID, placeholder string) api.Entity {
   288  	return api.Entity{
   289  		PackageID:                               repo.NewValidNullableString(packageID),
   290  		Name:                                    placeholder,
   291  		Description:                             repo.NewValidNullableString("desc_" + placeholder),
   292  		Group:                                   repo.NewValidNullableString("group_" + placeholder),
   293  		TargetURLs:                              repo.NewValidNullableString(`["` + fmt.Sprintf("https://%s.com", placeholder) + `"]`),
   294  		OrdID:                                   repo.NewValidNullableString(ordID),
   295  		LocalTenantID:                           repo.NewValidNullableString(localTenantID),
   296  		ShortDescription:                        repo.NewValidNullableString("shortDescription"),
   297  		SystemInstanceAware:                     repo.NewValidNullableBool(false),
   298  		PolicyLevel:                             sql.NullString{},
   299  		CustomPolicyLevel:                       sql.NullString{},
   300  		APIProtocol:                             repo.NewValidNullableString("apiProtocol"),
   301  		Tags:                                    repo.NewValidNullableString("[]"),
   302  		Countries:                               repo.NewValidNullableString("[]"),
   303  		Links:                                   repo.NewValidNullableString("[]"),
   304  		APIResourceLinks:                        repo.NewValidNullableString("[]"),
   305  		ReleaseStatus:                           repo.NewValidNullableString("releaseStatus"),
   306  		SunsetDate:                              repo.NewValidNullableString("sunsetDate"),
   307  		Successors:                              repo.NewValidNullableString(successors),
   308  		ChangeLogEntries:                        repo.NewValidNullableString("[]"),
   309  		Labels:                                  repo.NewValidNullableString("[]"),
   310  		Visibility:                              publicVisibility,
   311  		Disabled:                                repo.NewValidNullableBool(false),
   312  		PartOfProducts:                          repo.NewValidNullableString("[]"),
   313  		LineOfBusiness:                          repo.NewValidNullableString("[]"),
   314  		Industry:                                repo.NewValidNullableString("[]"),
   315  		ImplementationStandard:                  repo.NewValidNullableString("implementationStandard"),
   316  		CustomImplementationStandard:            repo.NewValidNullableString("customImplementationStandard"),
   317  		CustomImplementationStandardDescription: repo.NewValidNullableString("customImplementationStandardDescription"),
   318  		Extensible:                              repo.NewValidNullableString(extensible),
   319  		Version: version.Version{
   320  			Value:           repo.NewNullableString(str.Ptr("v1.1")),
   321  			Deprecated:      repo.NewValidNullableBool(false),
   322  			DeprecatedSince: repo.NewNullableString(str.Ptr("v1.0")),
   323  			ForRemoval:      repo.NewValidNullableBool(false),
   324  		},
   325  		ResourceHash:        repo.NewValidNullableString(resourceHash),
   326  		SupportedUseCases:   repo.NewValidNullableString("[]"),
   327  		Hierarchy:           repo.NewValidNullableString("[]"),
   328  		DocumentationLabels: repo.NewValidNullableString("[]"),
   329  		BaseEntity: &repo.BaseEntity{
   330  			ID:        apiDefID,
   331  			Ready:     true,
   332  			CreatedAt: &fixedTimestamp,
   333  			UpdatedAt: &time.Time{},
   334  			DeletedAt: &time.Time{},
   335  			Error:     sql.NullString{},
   336  		},
   337  	}
   338  }
   339  
   340  func fixAPIDefinitionColumns() []string {
   341  	return []string{"id", "app_id", "app_template_version_id", "package_id", "name", "description", "group_name", "ord_id", "local_tenant_id",
   342  		"short_description", "system_instance_aware", "policy_level", "custom_policy_level", "api_protocol",
   343  		"tags", "countries", "links", "api_resource_links", "release_status",
   344  		"sunset_date", "changelog_entries", "labels", "visibility", "disabled", "part_of_products", "line_of_business",
   345  		"industry", "version_value", "version_deprecated", "version_deprecated_since", "version_for_removal", "ready",
   346  		"created_at", "updated_at", "deleted_at", "error", "implementation_standard", "custom_implementation_standard",
   347  		"custom_implementation_standard_description", "target_urls", "extensible", "successors", "resource_hash", "hierarchy", "supported_use_cases", "documentation_labels"}
   348  }
   349  
   350  func fixAPIDefinitionRow(id, placeholder string) []driver.Value {
   351  	boolVar := false
   352  	return []driver.Value{id, appID, repo.NewValidNullableString(""), packageID, placeholder, "desc_" + placeholder, "group_" + placeholder,
   353  		ordID, localTenantID, "shortDescription", &boolVar, nil, nil, "apiProtocol", repo.NewValidNullableString("[]"),
   354  		repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), "releaseStatus", "sunsetDate", repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), publicVisibility, &boolVar,
   355  		repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), "v1.1", false, "v1.0", false, true, fixedTimestamp, time.Time{}, time.Time{}, nil,
   356  		"implementationStandard", "customImplementationStandard", "customImplementationStandardDescription", repo.NewValidNullableString(`["` + fmt.Sprintf("https://%s.com", placeholder) + `"]`),
   357  		repo.NewValidNullableString(extensible), repo.NewValidNullableString(successors), repo.NewValidNullableString(resourceHash), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]")}
   358  }
   359  
   360  func fixAPIDefinitionRowForAppTemplateVersion(id, placeholder string) []driver.Value {
   361  	boolVar := false
   362  	return []driver.Value{id, repo.NewValidNullableString(""), appTemplateVersionID, packageID, placeholder, "desc_" + placeholder, "group_" + placeholder,
   363  		ordID, localTenantID, "shortDescription", &boolVar, nil, nil, "apiProtocol", repo.NewValidNullableString("[]"),
   364  		repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), "releaseStatus", "sunsetDate", repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), publicVisibility, &boolVar,
   365  		repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), "v1.1", false, "v1.0", false, true, fixedTimestamp, time.Time{}, time.Time{}, nil,
   366  		"implementationStandard", "customImplementationStandard", "customImplementationStandardDescription", repo.NewValidNullableString(`["` + fmt.Sprintf("https://%s.com", placeholder) + `"]`),
   367  		repo.NewValidNullableString(extensible), repo.NewValidNullableString(successors), repo.NewValidNullableString(resourceHash), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]"), repo.NewValidNullableString("[]")}
   368  }
   369  
   370  func fixAPICreateArgs(id string, apiDef *model.APIDefinition) []driver.Value {
   371  	return []driver.Value{id, appID, repo.NewValidNullableString(""), packageID, apiDef.Name, apiDef.Description, apiDef.Group,
   372  		apiDef.OrdID, apiDef.LocalTenantID, apiDef.ShortDescription, apiDef.SystemInstanceAware, nil, nil, apiDef.APIProtocol, repo.NewNullableStringFromJSONRawMessage(apiDef.Tags), repo.NewNullableStringFromJSONRawMessage(apiDef.Countries),
   373  		repo.NewNullableStringFromJSONRawMessage(apiDef.Links), repo.NewNullableStringFromJSONRawMessage(apiDef.APIResourceLinks),
   374  		apiDef.ReleaseStatus, apiDef.SunsetDate, repo.NewNullableStringFromJSONRawMessage(apiDef.ChangeLogEntries), repo.NewNullableStringFromJSONRawMessage(apiDef.Labels), apiDef.Visibility,
   375  		apiDef.Disabled, repo.NewNullableStringFromJSONRawMessage(apiDef.PartOfProducts), repo.NewNullableStringFromJSONRawMessage(apiDef.LineOfBusiness), repo.NewNullableStringFromJSONRawMessage(apiDef.Industry),
   376  		apiDef.Version.Value, apiDef.Version.Deprecated, apiDef.Version.DeprecatedSince, apiDef.Version.ForRemoval, apiDef.Ready, apiDef.CreatedAt, apiDef.UpdatedAt, apiDef.DeletedAt, apiDef.Error,
   377  		apiDef.ImplementationStandard, apiDef.CustomImplementationStandard, apiDef.CustomImplementationStandardDescription, repo.NewNullableStringFromJSONRawMessage(apiDef.TargetURLs), extensible,
   378  		repo.NewNullableStringFromJSONRawMessage(apiDef.Successors), apiDef.ResourceHash, repo.NewNullableStringFromJSONRawMessage(apiDef.Hierarchy), repo.NewNullableStringFromJSONRawMessage(apiDef.SupportedUseCases), repo.NewNullableStringFromJSONRawMessage(apiDef.DocumentationLabels)}
   379  }
   380  
   381  func fixAPICreateArgsForAppTemplateVersion(id string, apiDef *model.APIDefinition) []driver.Value {
   382  	return []driver.Value{id, repo.NewValidNullableString(""), appTemplateVersionID, packageID, apiDef.Name, apiDef.Description, apiDef.Group,
   383  		apiDef.OrdID, apiDef.LocalTenantID, apiDef.ShortDescription, apiDef.SystemInstanceAware, nil, nil, apiDef.APIProtocol, repo.NewNullableStringFromJSONRawMessage(apiDef.Tags), repo.NewNullableStringFromJSONRawMessage(apiDef.Countries),
   384  		repo.NewNullableStringFromJSONRawMessage(apiDef.Links), repo.NewNullableStringFromJSONRawMessage(apiDef.APIResourceLinks),
   385  		apiDef.ReleaseStatus, apiDef.SunsetDate, repo.NewNullableStringFromJSONRawMessage(apiDef.ChangeLogEntries), repo.NewNullableStringFromJSONRawMessage(apiDef.Labels), apiDef.Visibility,
   386  		apiDef.Disabled, repo.NewNullableStringFromJSONRawMessage(apiDef.PartOfProducts), repo.NewNullableStringFromJSONRawMessage(apiDef.LineOfBusiness), repo.NewNullableStringFromJSONRawMessage(apiDef.Industry),
   387  		apiDef.Version.Value, apiDef.Version.Deprecated, apiDef.Version.DeprecatedSince, apiDef.Version.ForRemoval, apiDef.Ready, apiDef.CreatedAt, apiDef.UpdatedAt, apiDef.DeletedAt, apiDef.Error,
   388  		apiDef.ImplementationStandard, apiDef.CustomImplementationStandard, apiDef.CustomImplementationStandardDescription, repo.NewNullableStringFromJSONRawMessage(apiDef.TargetURLs), extensible,
   389  		repo.NewNullableStringFromJSONRawMessage(apiDef.Successors), apiDef.ResourceHash, repo.NewNullableStringFromJSONRawMessage(apiDef.Hierarchy), repo.NewNullableStringFromJSONRawMessage(apiDef.SupportedUseCases), repo.NewNullableStringFromJSONRawMessage(apiDef.DocumentationLabels)}
   390  }
   391  
   392  func fixModelFetchRequest(id, url string, timestamp time.Time) *model.FetchRequest {
   393  	return &model.FetchRequest{
   394  		ID:     id,
   395  		URL:    url,
   396  		Auth:   nil,
   397  		Mode:   "SINGLE",
   398  		Filter: nil,
   399  		Status: &model.FetchRequestStatus{
   400  			Condition: model.FetchRequestStatusConditionInitial,
   401  			Timestamp: timestamp,
   402  		},
   403  		ObjectType: model.APISpecFetchRequestReference,
   404  		ObjectID:   specID,
   405  	}
   406  }
   407  
   408  func fixModelBundleReference(bundleID, apiID string) *model.BundleReference {
   409  	return &model.BundleReference{
   410  		BundleID:   str.Ptr(bundleID),
   411  		ObjectType: model.BundleAPIReference,
   412  		ObjectID:   str.Ptr(apiID),
   413  	}
   414  }
   415  
   416  func fixGQLFetchRequest(url string, timestamp time.Time) *graphql.FetchRequest {
   417  	return &graphql.FetchRequest{
   418  		Filter: nil,
   419  		Mode:   graphql.FetchModeSingle,
   420  		Auth:   nil,
   421  		URL:    url,
   422  		Status: &graphql.FetchRequestStatus{
   423  			Timestamp: graphql.Timestamp(timestamp),
   424  			Condition: graphql.FetchRequestStatusConditionInitial,
   425  		},
   426  	}
   427  }
   428  
   429  func timeToTimestampPtr(time time.Time) *graphql.Timestamp {
   430  	t := graphql.Timestamp(time)
   431  	return &t
   432  }