diff --git a/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator.go b/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator.go index 4be6e5e92..30c1fc7c8 100644 --- a/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator.go +++ b/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator.go @@ -3,6 +3,7 @@ package openapi import ( "fmt" "github.com/dikhan/terraform-provider-openapi/openapi" + "github.com/dikhan/terraform-provider-openapi/utils/terraform_docs_generator/openapi/templates/zendesk" "github.com/mitchellh/hashstructure" "sort" ) @@ -58,6 +59,7 @@ func (t TerraformProviderDocGenerator) GenerateDocumentation() (TerraformProvide return TerraformProviderDocumentation{ ProviderName: t.ProviderName, ProviderInstallation: ProviderInstallation{ + ProviderName: t.ProviderName, Example: fmt.Sprintf("$ export PROVIDER_NAME=%s && curl -fsSL https://raw.githubusercontent.com/dikhan/terraform-provider-openapi/master/scripts/install.sh | bash -s -- --provider-name $PROVIDER_NAME
"+ "[INFO] Downloading https://github.com/dikhan/terraform-provider-openapi/releases/download/v0.29.4/terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz in temporally folder /var/folders/n_/1lrwb99s7f50xmn9jpmfnddh0000gp/T/tmp.Xv1AkIZh...
"+ "[INFO] Extracting terraform-provider-openapi from terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz...
"+ @@ -65,18 +67,27 @@ func (t TerraformProviderDocGenerator) GenerateDocumentation() (TerraformProvide "[INFO] Terraform provider 'terraform-provider-%s' successfully installed at: '~/.terraform.d/plugins'!", t.ProviderName, t.ProviderName), Other: "You can then start running the Terraform provider:", OtherCommand: fmt.Sprintf("$ export OTF_VAR_%s_PLUGIN_CONFIGURATION_FILE=\"https://api.service.com/openapi.yaml\"
", t.ProviderName), + Template: zendesk.ProviderInstallationTmpl, }, ProviderConfiguration: ProviderConfiguration{ + ProviderName: t.ProviderName, Regions: configRegions, ConfigProperties: configProperties, + Template: zendesk.ProviderConfigurationTmpl, }, ProviderResources: ProviderResources{ - Resources: resources, + ProviderName: t.ProviderName, + Resources: resources, + Template: zendesk.ProviderResourcesTmpl, }, DataSources: DataSources{ + ProviderName: t.ProviderName, DataSources: dataSourceFilters, DataSourceInstances: dataSourceInstances, + Template: zendesk.DataSourcesTmpl, }, + TableOfContentsTemplate: zendesk.TableOfContentsTmpl, + SpecialTermsDefinitionsTemplate: zendesk.SpecialTermsTmpl, }, err } diff --git a/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator_test.go b/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator_test.go index a682c9442..22b0169c5 100644 --- a/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator_test.go +++ b/utils/terraform_docs_generator/openapi/openapi_terraform_provider_doc_generator_test.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "github.com/dikhan/terraform-provider-openapi/openapi" + "github.com/dikhan/terraform-provider-openapi/utils/terraform_docs_generator/openapi/templates/zendesk" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -80,6 +81,7 @@ func TestGenerateDocumentation(t *testing.T) { assert.Equal(t, providerName, d.ProviderName) // ProviderInstallation assertions + assert.Equal(t, providerName, d.ProviderInstallation.ProviderName) expectedProviderInstallExample := fmt.Sprintf("$ export PROVIDER_NAME=%s && curl -fsSL https://raw.githubusercontent.com/dikhan/terraform-provider-openapi/master/scripts/install.sh | bash -s -- --provider-name $PROVIDER_NAME
"+ "[INFO] Downloading https://github.com/dikhan/terraform-provider-openapi/releases/download/v0.29.4/terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz in temporally folder /var/folders/n_/1lrwb99s7f50xmn9jpmfnddh0000gp/T/tmp.Xv1AkIZh...
"+ "[INFO] Extracting terraform-provider-openapi from terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz...
"+ @@ -88,14 +90,18 @@ func TestGenerateDocumentation(t *testing.T) { assert.Equal(t, expectedProviderInstallExample, d.ProviderInstallation.Example) assert.Equal(t, "You can then start running the Terraform provider:", d.ProviderInstallation.Other) assert.Equal(t, fmt.Sprintf("$ export OTF_VAR_%s_PLUGIN_CONFIGURATION_FILE=\"https://api.service.com/openapi.yaml\"
", providerName), d.ProviderInstallation.OtherCommand) + assert.Equal(t, zendesk.ProviderInstallationTmpl, d.ProviderInstallation.Template) // ProviderConfiguration assertions + assert.Equal(t, providerName, d.ProviderConfiguration.ProviderName) assert.Equal(t, []string{"region1", "region2", "region3"}, d.ProviderConfiguration.Regions) assert.Equal(t, []Property{{Name: "required_token", Type: "string", ArrayItemsType: "", Required: true, Computed: false, Description: "", Schema: nil}}, d.ProviderConfiguration.ConfigProperties) assert.Nil(t, d.ProviderConfiguration.ExampleUsage) assert.Equal(t, ArgumentsReference{Notes: nil}, d.ProviderConfiguration.ArgumentsReference) + assert.Equal(t, zendesk.ProviderConfigurationTmpl, d.ProviderConfiguration.Template) // ProviderResources assertions + assert.Equal(t, providerName, d.ProviderResources.ProviderName) assert.Len(t, d.ProviderResources.Resources, 1) cdnResource := d.ProviderResources.Resources[0] assert.Equal(t, "cdn_v1", cdnResource.Name) @@ -104,6 +110,11 @@ func TestGenerateDocumentation(t *testing.T) { cdnResourceProps := cdnResource.Properties assert.Len(t, cdnResourceProps, 1) assertProperty(t, cdnResourceProps[0], "id", "string", "", "", false, true, nil) + assert.Equal(t, zendesk.ProviderResourcesTmpl, d.ProviderResources.Template) + + // DataSources assertions + assert.Equal(t, providerName, d.DataSources.ProviderName) + assert.Equal(t, zendesk.DataSourcesTmpl, d.DataSources.Template) // DataSource assertions assert.Len(t, d.DataSources.DataSources, 1) diff --git a/utils/terraform_docs_generator/openapi/terraform_provider_documentation.go b/utils/terraform_docs_generator/openapi/terraform_provider_documentation.go index b921d32f7..f73400ae9 100644 --- a/utils/terraform_docs_generator/openapi/terraform_provider_documentation.go +++ b/utils/terraform_docs_generator/openapi/terraform_provider_documentation.go @@ -1,18 +1,19 @@ package openapi import ( - "github.com/dikhan/terraform-provider-openapi/utils/terraform_docs_generator/openapi/templates/zendesk" "io" ) // TerraformProviderDocumentation defines the attributes needed to generate Terraform provider documentation type TerraformProviderDocumentation struct { - ProviderName string - ProviderInstallation ProviderInstallation - ProviderConfiguration ProviderConfiguration - ProviderResources ProviderResources - DataSources DataSources - ShowSpecialTermsDefinitions bool + ProviderName string + ProviderInstallation ProviderInstallation + ProviderConfiguration ProviderConfiguration + ProviderResources ProviderResources + DataSources DataSources + ShowSpecialTermsDefinitions bool + TableOfContentsTemplate string + SpecialTermsDefinitionsTemplate string } // ProviderInstallation includes details needed to install the Terraform provider plugin @@ -25,11 +26,13 @@ type ProviderInstallation struct { Other string // Other code/commands needed to install/run the provider OtherCommand string + // Template used to render HTML + Template string } // RenderZendesk renders into the input writer the ProviderInstallation documentation formatted in HTML func (t ProviderInstallation) RenderZendesk(w io.Writer) error { - return Render(w, "ProviderInstallation", zendesk.ProviderInstallationTmpl, t) + return Render(w, "ProviderInstallation", t.Template, t) } // ProviderConfiguration defines the details needed to properly configure the Terraform provider @@ -40,11 +43,12 @@ type ProviderConfiguration struct { ConfigProperties []Property ExampleUsage []ExampleUsage ArgumentsReference ArgumentsReference + Template string } // RenderZendesk renders into the input writer the ProviderInstallation documentation formatted in HTML func (t ProviderConfiguration) RenderZendesk(w io.Writer) error { - return Render(w, "ProviderConfiguration", zendesk.ProviderConfigurationTmpl, t) + return Render(w, "ProviderConfiguration", t.Template, t) } // ProviderResources defines the resources exposed by the Terraform provider @@ -52,11 +56,12 @@ type ProviderResources struct { // ProviderName is the name of the provider ProviderName string Resources []Resource + Template string } // RenderZendesk renders into the input writer the ProviderResources documentation formatted in HTML func (t ProviderResources) RenderZendesk(w io.Writer) error { - return Render(w, "ProviderResources", zendesk.ProviderResourcesTmpl, t) + return Render(w, "ProviderResources", t.Template, t) } func (r ProviderResources) ContainsResourcesWithSecretProperties() bool { @@ -76,11 +81,12 @@ type DataSources struct { ProviderName string DataSources []DataSource DataSourceInstances []DataSource + Template string } // RenderZendesk renders into the input writer the DataSources documentation formatted in HTML func (t DataSources) RenderZendesk(w io.Writer) error { - return Render(w, "DataSources", zendesk.DataSourcesTmpl, t) + return Render(w, "DataSources", t.Template, t) } // DataSource defines the attributes to generate documentation for a Terraform provider data source @@ -157,31 +163,27 @@ func (p Property) ContainsComputedSubProperties() bool { // RenderZendeskHTML renders the documentation in HTML func (t TerraformProviderDocumentation) RenderZendeskHTML(w io.Writer) error { - err := Render(w, "TerraformProviderDocTableOfContents", zendesk.TableOfContentsTmpl, t) + err := Render(w, "TerraformProviderDocTableOfContents", t.TableOfContentsTemplate, t) if err != nil { return err } - t.ProviderInstallation.ProviderName = t.ProviderName err = t.ProviderInstallation.RenderZendesk(w) if err != nil { return err } - t.ProviderConfiguration.ProviderName = t.ProviderName err = t.ProviderConfiguration.RenderZendesk(w) if err != nil { return err } - t.ProviderResources.ProviderName = t.ProviderName err = t.ProviderResources.RenderZendesk(w) if err != nil { return err } - t.DataSources.ProviderName = t.ProviderName err = t.DataSources.RenderZendesk(w) if err != nil { return err } - err = Render(w, "TerraformProviderDocSpecialTermsDefinitions", zendesk.SpecialTermsTmpl, t) + err = Render(w, "TerraformProviderDocSpecialTermsDefinitions", t.SpecialTermsDefinitionsTemplate, t) if err != nil { return err } diff --git a/utils/terraform_docs_generator/openapi/terraform_provider_documentation_test.go b/utils/terraform_docs_generator/openapi/terraform_provider_documentation_test.go index f475a5b14..02af318a8 100644 --- a/utils/terraform_docs_generator/openapi/terraform_provider_documentation_test.go +++ b/utils/terraform_docs_generator/openapi/terraform_provider_documentation_test.go @@ -2,9 +2,12 @@ package openapi import ( "bytes" + "errors" + "github.com/dikhan/terraform-provider-openapi/utils/terraform_docs_generator/openapi/templates/zendesk" "github.com/stretchr/testify/assert" "strings" "testing" + "text/template" ) func TestProviderResources_RenderZendesk(t *testing.T) { @@ -47,6 +50,7 @@ func TestProviderResources_RenderZendesk(t *testing.T) { }, }, }, + Template: zendesk.ProviderResourcesTmpl, } var buf bytes.Buffer expectedHTML := `

Provider Resources

@@ -200,6 +204,7 @@ func TestDataSources_RenderZendesk(t *testing.T) { }, }, }, + Template: zendesk.DataSourcesTmpl, } var buf bytes.Buffer expectedHTML := `

Data Sources (using resource id)

@@ -336,6 +341,7 @@ func TestProviderInstallation_RenderZendesk(t *testing.T) { Example: "➜ ~ This is an example", Other: "Some more info about the installation", OtherCommand: "➜ ~ init_command do_something", + Template: zendesk.ProviderInstallationTmpl, } var buf bytes.Buffer expectedHTML := `

Provider Installation

@@ -370,6 +376,7 @@ func TestProviderConfiguration_RenderZendesk(t *testing.T) { ArgumentsReference: ArgumentsReference{ Notes: []string{"Note: some special notes..."}, }, + Template: zendesk.ProviderConfigurationTmpl, } var buf bytes.Buffer expectedHTML := `

Provider Configuration

@@ -476,18 +483,31 @@ func TestProperty_ContainsComputedSubProperties(t *testing.T) { } func TestTerraformProviderDocumentation_RenderZendeskHTML(t *testing.T) { + providerName := "openapi" terraformProviderDocumentation := TerraformProviderDocumentation{ - ProviderName: "openapi", - ProviderInstallation: ProviderInstallation{}, - ProviderConfiguration: ProviderConfiguration{}, + ProviderName: providerName, + ProviderInstallation: ProviderInstallation{ + ProviderName: providerName, + Template: zendesk.ProviderInstallationTmpl, + }, + ProviderConfiguration: ProviderConfiguration{ + ProviderName: providerName, + Template: zendesk.ProviderConfigurationTmpl, + }, ShowSpecialTermsDefinitions: true, ProviderResources: ProviderResources{ - Resources: []Resource{}, + ProviderName: providerName, + Resources: []Resource{}, + Template: zendesk.ProviderResourcesTmpl, }, DataSources: DataSources{ + ProviderName: providerName, DataSourceInstances: []DataSource{}, DataSources: []DataSource{}, + Template: zendesk.DataSourcesTmpl, }, + TableOfContentsTemplate: zendesk.TableOfContentsTmpl, + SpecialTermsDefinitionsTemplate: zendesk.SpecialTermsTmpl, } var buf bytes.Buffer expectedHTML := `

@@ -556,6 +576,64 @@ func TestTerraformProviderDocumentation_RenderZendeskHTML(t *testing.T) { assert.Nil(t, err) } +func TestTerraformProviderDocumentation_RenderZendeskHTML_Errors(t *testing.T) { + testCases := []struct { + name string + terraformProviderDocumentation TerraformProviderDocumentation + expectedErr error + }{ + { + name: "provider installation template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + ProviderInstallation: ProviderInstallation{Template: `{{.nonExistentVariable}}`}, + }, + expectedErr: errors.New("template: ProviderInstallation:1:2: executing \"ProviderInstallation\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.ProviderInstallation"), + }, + { + name: "provider configuration template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + ProviderConfiguration: ProviderConfiguration{Template: `{{.nonExistentVariable}}`}, + }, + expectedErr: errors.New("template: ProviderConfiguration:1:2: executing \"ProviderConfiguration\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.ProviderConfiguration"), + }, + { + name: "provider resources template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + ProviderResources: ProviderResources{Template: `{{.nonExistentVariable}}`}, + }, + expectedErr: errors.New("template: ProviderResources:1:2: executing \"ProviderResources\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.ProviderResources"), + }, + { + name: "data sources template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + DataSources: DataSources{Template: `{{.nonExistentVariable}}`}, + }, + expectedErr: errors.New("template: DataSources:1:2: executing \"DataSources\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.DataSources"), + }, + { + name: "table of contents template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + TableOfContentsTemplate: `{{.nonExistentVariable}}`, + }, + expectedErr: errors.New("template: TerraformProviderDocTableOfContents:1:2: executing \"TerraformProviderDocTableOfContents\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.TerraformProviderDocumentation"), + }, + { + name: "special terms definitions template error", + terraformProviderDocumentation: TerraformProviderDocumentation{ + SpecialTermsDefinitionsTemplate: `{{.nonExistentVariable}}`, + }, + expectedErr: errors.New("template: TerraformProviderDocSpecialTermsDefinitions:1:2: executing \"TerraformProviderDocSpecialTermsDefinitions\" at <.nonExistentVariable>: can't evaluate field nonExistentVariable in type openapi.TerraformProviderDocumentation"), + }, + } + + for _, tc := range testCases { + var buf bytes.Buffer + err := tc.terraformProviderDocumentation.RenderZendeskHTML(&buf) + templateErr := err.(template.ExecError) + assert.EqualError(t, templateErr.Err, tc.expectedErr.Error()) + } +} + func createProperty(name, properType, description string, required, computed bool) Property { return Property{ Name: name,