Skip to content

Commit

Permalink
refactor documentation structs to hold a reference to their templates
Browse files Browse the repository at this point in the history
- so rendering errors can be tested with
TestTerraformProviderDocumentation_RenderZendeskHTML_Errors
- add assertions to TestGenerateDocumentation to check that provider name is
assigned as expected
- refactor GenerateDocumentation on the DocGenerator to assign the providerName
- update TestGenerateDocumentation to check provider name is assigned as expected
  • Loading branch information
lillchan committed Jun 30, 2020
1 parent 4800be7 commit 1449f85
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 22 deletions.
Expand Up @@ -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"
)
Expand Down Expand Up @@ -58,25 +59,35 @@ 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<br>"+
"[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...<br>"+
"[INFO] Extracting terraform-provider-openapi from terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz...<br>"+
"[INFO] Cleaning up tmp dir created for installation purposes: /var/folders/n_/1lrwb99s7f50xmn9jpmfnddh0000gp/T/tmp.Xv1AkIZh<br>"+
"[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\"<br>", 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
}

Expand Down
Expand Up @@ -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"
Expand Down Expand Up @@ -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<br>"+
"[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...<br>"+
"[INFO] Extracting terraform-provider-openapi from terraform-provider-openapi_0.29.4_darwin_amd64.tar.gz...<br>"+
Expand All @@ -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\"<br>", 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)
Expand All @@ -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)
Expand Down
@@ -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
Expand All @@ -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
Expand All @@ -40,23 +43,25 @@ 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
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 {
Expand All @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
Expand Up @@ -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) {
Expand Down Expand Up @@ -47,6 +50,7 @@ func TestProviderResources_RenderZendesk(t *testing.T) {
},
},
},
Template: zendesk.ProviderResourcesTmpl,
}
var buf bytes.Buffer
expectedHTML := `<h2 id="provider_resources">Provider Resources</h2>
Expand Down Expand Up @@ -200,6 +204,7 @@ func TestDataSources_RenderZendesk(t *testing.T) {
},
},
},
Template: zendesk.DataSourcesTmpl,
}
var buf bytes.Buffer
expectedHTML := `<h2 id="provider_datasources">Data Sources (using resource id)</h2>
Expand Down Expand Up @@ -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 := `<h2 id="provider_installation">Provider Installation</h2>
Expand Down Expand Up @@ -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 := `<h2 id="provider_configuration">Provider Configuration</h2>
Expand Down Expand Up @@ -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 := `<p dir="ltr">
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 1449f85

Please sign in to comment.