Skip to content

Commit 42682b1

Browse files
committed
Add tests
1 parent 8bee428 commit 42682b1

File tree

2 files changed

+167
-109
lines changed

2 files changed

+167
-109
lines changed

internal/docs/readme_test.go

Lines changed: 161 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ Introduction to the package`,
5555
t.Run(c.title, func(t *testing.T) {
5656

5757
dir := t.TempDir()
58-
err := createReadmeFile(dir, c.readmeTemplateContents)
59-
require.NoError(t, err)
58+
createReadmeTemplateFile(t, dir, c.readmeTemplateContents)
6059

6160
rendered, isTemplate, err := generateReadme(c.filename, "", dir, dir)
6261
require.NoError(t, err)
@@ -112,8 +111,7 @@ http://www.example.com/bar
112111
filename := filepath.Base(c.templatePath)
113112
templatePath := filepath.Join(c.packageRoot, c.templatePath)
114113

115-
err := createReadmeFile(c.packageRoot, c.readmeTemplateContents)
116-
require.NoError(t, err)
114+
createReadmeTemplateFile(t, c.packageRoot, c.readmeTemplateContents)
117115

118116
rendered, err := renderReadme(filename, c.packageRoot, templatePath, c.linksMap)
119117
require.NoError(t, err)
@@ -165,14 +163,9 @@ An example event for ` + "`example`" + ` looks as following:
165163
filename := filepath.Base(c.templatePath)
166164
templatePath := filepath.Join(c.packageRoot, c.templatePath)
167165

168-
err := createReadmeFile(c.packageRoot, c.readmeTemplateContents)
169-
require.NoError(t, err)
170-
171-
err = createSampleEventFile(c.packageRoot, c.dataStreamName, c.sampleEventJsonContents)
172-
require.NoError(t, err)
173-
174-
err = createManifestFile(c.packageRoot)
175-
require.NoError(t, err)
166+
createReadmeTemplateFile(t, c.packageRoot, c.readmeTemplateContents)
167+
createSampleEventFile(t, c.packageRoot, c.dataStreamName, c.sampleEventJsonContents)
168+
createManifestFile(t, c.packageRoot)
176169

177170
rendered, err := renderReadme(filename, c.packageRoot, templatePath, linksMap)
178171
require.NoError(t, err)
@@ -183,26 +176,23 @@ An example event for ` + "`example`" + ` looks as following:
183176
}
184177
}
185178

186-
func TesRenderReadmeWithFields(t *testing.T) {
187-
cases := []struct {
188-
title string
189-
packageRoot string
190-
templatePath string
191-
dataStreamName string
192-
readmeTemplateContents string
193-
fieldsContents string
194-
expected string
195-
}{
196-
{
197-
title: "README fields from package",
198-
packageRoot: t.TempDir(),
199-
templatePath: "_dev/build/docs/README.md",
200-
readmeTemplateContents: `
179+
var renderCases = []struct {
180+
title string
181+
templatePath string
182+
dataStreamName string
183+
readmeTemplateContents string
184+
fieldsContents string
185+
expected string
186+
}{
187+
{
188+
title: "README fields from package",
189+
templatePath: "_dev/build/docs/README.md",
190+
readmeTemplateContents: `
201191
{{- generatedHeader }}
202192
# README
203193
Introduction to the package
204194
{{ fields }}`,
205-
expected: `<!-- NOTICE: Do not edit this file manually.-->
195+
expected: `<!-- NOTICE: Do not edit this file manually.-->
206196
<!-- This file is automatically generated by Elastic Package -->
207197
# README
208198
Introduction to the package
@@ -212,71 +202,95 @@ Introduction to the package
212202
|---|---|---|
213203
| data_stream.type | Data stream type package. | constant_keyword |
214204
`,
215-
dataStreamName: "",
216-
fieldsContents: `
205+
dataStreamName: "",
206+
fieldsContents: `
217207
- name: data_stream.type
218208
type: constant_keyword
219209
description: Data stream type package.`,
220-
},
221-
{
222-
title: "README with one field",
223-
packageRoot: t.TempDir(),
224-
templatePath: "_dev/build/docs/README.md",
225-
readmeTemplateContents: `
226-
# README
210+
},
211+
{
212+
title: "README with one field",
213+
templatePath: "_dev/build/docs/README.md",
214+
readmeTemplateContents: `# README
227215
Introduction to the package
228216
{{ fields "example" }}`,
229-
expected: `<!-- NOTICE: Do not edit this file manually.-->
230-
<!-- This file is automatically generated by Elastic Package -->
231-
# README
217+
expected: `# README
232218
Introduction to the package
233219
**Exported fields**
234220
235221
| Field | Description | Type |
236222
|---|---|---|
237223
| data_stream.type | Data stream type. | constant_keyword |
238224
`,
239-
dataStreamName: "example",
240-
fieldsContents: `
225+
dataStreamName: "example",
226+
fieldsContents: `
241227
- name: data_stream.type
242228
type: constant_keyword
243229
description: Data stream type.`,
244-
},
245-
{
246-
title: "README no fields",
247-
packageRoot: t.TempDir(),
248-
templatePath: "_dev/build/docs/README.md",
249-
readmeTemplateContents: `
230+
},
231+
{
232+
title: "README with group fields",
233+
templatePath: "_dev/build/docs/README.md",
234+
readmeTemplateContents: `
235+
# README
236+
Introduction to the package
237+
{{ fields "example" }}`,
238+
expected: `
239+
# README
240+
Introduction to the package
241+
**Exported fields**
242+
243+
| Field | Description | Type |
244+
|---|---|---|
245+
| dns.answers | An array containing an object for each answer section returned by the server. The main keys that should be present in these objects are defined by ECS. Records that have more information may contain more keys than what ECS defines. Not all DNS data sources give all details about DNS answers. At minimum, answer objects must contain the ` + "`data`" + ` key. If more information is available, map as much of it to ECS as possible, and add any additional fields to the answer objects as custom fields. | group |
246+
| dns.answers.name | The domain name to which this resource record pertains. If a chain of CNAME is being resolved, each answer's ` + "`name`" + ` should be the one that corresponds with the answer's ` + "`data`" + `. It should not simply be the original ` + "`question.name`" + ` repeated. | keyword |
247+
`,
248+
dataStreamName: "example",
249+
fieldsContents: `
250+
- name: emptygroup
251+
type: group
252+
- external: ecs
253+
name: dns.answers
254+
type: group
255+
- external: ecs
256+
name: dns.answers.name
257+
`,
258+
},
259+
{
260+
title: "README no fields",
261+
templatePath: "_dev/build/docs/README.md",
262+
readmeTemplateContents: `
250263
{{- generatedHeader }}
251264
# README
252265
Introduction to the package
253266
{{ fields "notexist" }}`,
254-
expected: `<!-- NOTICE: Do not edit this file manually.-->
267+
expected: `<!-- NOTICE: Do not edit this file manually.-->
255268
<!-- This file is automatically generated by Elastic Package -->
256269
# README
257270
Introduction to the package
258271
**Exported fields**
259272
260273
(no fields available)
261274
`,
262-
dataStreamName: "example",
263-
fieldsContents: "",
264-
},
265-
}
275+
dataStreamName: "example",
276+
fieldsContents: "",
277+
},
278+
}
266279

280+
func TestRenderReadmeWithFields(t *testing.T) {
267281
linksMap := newEmptyLinkMap()
268-
for _, c := range cases {
282+
for _, c := range renderCases {
269283
t.Run(c.title, func(t *testing.T) {
284+
packageRoot := t.TempDir()
270285
filename := filepath.Base(c.templatePath)
271-
templatePath := filepath.Join(c.packageRoot, c.templatePath)
286+
templatePath := filepath.Join(packageRoot, c.templatePath)
272287

273-
err := createReadmeFile(c.packageRoot, c.readmeTemplateContents)
274-
require.NoError(t, err)
288+
createManifestFile(t, packageRoot)
289+
createBuildFile(t, packageRoot)
290+
createReadmeTemplateFile(t, packageRoot, c.readmeTemplateContents)
291+
createFieldsFile(t, packageRoot, c.dataStreamName, c.fieldsContents)
275292

276-
err = createFieldsFile(c.packageRoot, c.dataStreamName, c.fieldsContents)
277-
require.NoError(t, err)
278-
279-
rendered, err := renderReadme(filename, c.packageRoot, templatePath, linksMap)
293+
rendered, err := renderReadme(filename, packageRoot, templatePath, linksMap)
280294
require.NoError(t, err)
281295

282296
renderedString := string(rendered)
@@ -285,81 +299,123 @@ Introduction to the package
285299
}
286300
}
287301

288-
func createReadmeFile(packageRoot, contents string) error {
289-
docsFolder, err := createDocsFolder(packageRoot)
290-
if err != nil {
291-
return err
302+
func TestUpdateReadmeWithFields(t *testing.T) {
303+
for _, c := range renderCases {
304+
t.Run(c.title, func(t *testing.T) {
305+
packageRoot := t.TempDir()
306+
filename := filepath.Base(c.templatePath)
307+
308+
createManifestFile(t, packageRoot)
309+
createBuildFile(t, packageRoot)
310+
createReadmeTemplateFile(t, packageRoot, c.readmeTemplateContents)
311+
createFieldsFile(t, packageRoot, c.dataStreamName, c.fieldsContents)
312+
313+
packageBuildRoot := t.TempDir()
314+
createManifestFile(t, packageBuildRoot)
315+
316+
readmePath, err := updateReadme(filename, "", packageRoot, packageBuildRoot)
317+
require.NoError(t, err)
318+
require.NotEmpty(t, readmePath)
319+
d, err := os.ReadFile(readmePath)
320+
require.NoError(t, err)
321+
assert.Equal(t, string(c.expected), string(d))
322+
323+
builtReadmePath, err := filepath.Rel(packageRoot, readmePath)
324+
require.NoError(t, err)
325+
builtReadmePath = filepath.Join(packageBuildRoot, builtReadmePath)
326+
d, err = os.ReadFile(builtReadmePath)
327+
require.NoError(t, err)
328+
assert.Equal(t, string(c.expected), string(d))
329+
})
292330
}
331+
}
293332

333+
func createReadmeTemplateFile(t *testing.T, packageRoot, contents string) {
334+
t.Helper()
335+
docsFolder := createDocsFolder(t, packageRoot)
294336
if contents != "" {
295337
readmeFile := filepath.Join(docsFolder, "README.md")
296-
os.WriteFile(readmeFile, []byte(contents), 0644)
338+
err := os.WriteFile(readmeFile, []byte(contents), 0644)
339+
require.NoError(t, err)
297340
}
298-
return nil
299341
}
300342

301-
func createDocsFolder(packageRoot string) (string, error) {
343+
func createDocsFolder(t *testing.T, packageRoot string) string {
344+
t.Helper()
302345
docsFolder := filepath.Join(packageRoot, "_dev", "build", "docs")
303-
err := os.MkdirAll(docsFolder, os.ModePerm)
304-
if err != nil {
305-
return "", err
306-
}
307-
return docsFolder, nil
346+
err := os.MkdirAll(docsFolder, 0755)
347+
require.NoError(t, err)
348+
return docsFolder
308349
}
309350

310-
func createSampleEventFile(packageRoot, dataStreamName, contents string) error {
311-
dataStreamFolder, err := createDataStreamFolder(packageRoot, dataStreamName)
312-
if err != nil {
313-
return err
314-
}
351+
func createSampleEventFile(t *testing.T, packageRoot, dataStreamName, contents string) {
352+
t.Helper()
353+
dataStreamFolder := createDataStreamFolder(t, packageRoot, dataStreamName)
315354

316355
sampleEventFile := filepath.Join(dataStreamFolder, sampleEventFile)
317-
if err := os.WriteFile(sampleEventFile, []byte(contents), 0644); err != nil {
318-
return err
319-
}
320-
return nil
356+
err := os.WriteFile(sampleEventFile, []byte(contents), 0644)
357+
require.NoError(t, err)
321358
}
322359

323-
func createManifestFile(packageRoot string) error {
360+
func createManifestFile(t *testing.T, packageRoot string) {
361+
t.Helper()
324362
// Minimal content needed to render readme.
325-
manifest := `format_version: 2.10.0`
363+
manifest := `format_version: 2.10.0
364+
type: integration
365+
version: 1.0.0
366+
`
326367
manifestFile := filepath.Join(packageRoot, packages.PackageManifestFile)
327-
return os.WriteFile(manifestFile, []byte(manifest), 0644)
368+
err := os.WriteFile(manifestFile, []byte(manifest), 0644)
369+
require.NoError(t, err)
328370
}
329371

330-
func createDataStreamFolder(packageRoot, dataStreamName string) (string, error) {
372+
func createDataStreamFolder(t *testing.T, packageRoot, dataStreamName string) string {
373+
t.Helper()
331374
if dataStreamName == "" {
332-
return "", nil
375+
return ""
333376
}
334377

335378
dataStreamFolder := filepath.Join(packageRoot, "data_stream", dataStreamName)
336-
if err := os.MkdirAll(dataStreamFolder, os.ModePerm); err != nil {
337-
return "", err
338-
}
339-
return dataStreamFolder, nil
379+
err := os.MkdirAll(dataStreamFolder, 0755)
380+
require.NoError(t, err)
381+
382+
return dataStreamFolder
340383
}
341384

342-
func createFieldsFile(packageRoot, dataStreamName, contents string) error {
343-
fieldsFolder, err := createFieldsFolder(packageRoot, dataStreamName)
344-
if err != nil {
345-
return err
346-
}
385+
func createFieldsFile(t *testing.T, packageRoot, dataStreamName, contents string) {
386+
t.Helper()
387+
fieldsFolder := createFieldsFolder(t, packageRoot, dataStreamName)
347388
fieldsFile := filepath.Join(fieldsFolder, "fields.yml")
348-
if err := os.WriteFile(fieldsFile, []byte(contents), 0644); err != nil {
349-
return err
350-
}
351-
return nil
389+
390+
err := os.WriteFile(fieldsFile, []byte(contents), 0644)
391+
require.NoError(t, err)
352392
}
353393

354-
func createFieldsFolder(packageRoot, dataStreamName string) (string, error) {
394+
func createFieldsFolder(t *testing.T, packageRoot, dataStreamName string) string {
395+
t.Helper()
355396
fieldsFolder := packageRoot
356397
if dataStreamName != "" {
357398
fieldsFolder = filepath.Join(fieldsFolder, "data_stream", dataStreamName)
358399
}
359400
fieldsFolder = filepath.Join(fieldsFolder, "fields")
360401

361-
if err := os.MkdirAll(fieldsFolder, os.ModePerm); err != nil {
362-
return "", err
363-
}
364-
return fieldsFolder, nil
402+
err := os.MkdirAll(fieldsFolder, 0755)
403+
require.NoError(t, err)
404+
405+
return fieldsFolder
406+
}
407+
408+
func createBuildFile(t *testing.T, packageRoot string) {
409+
t.Helper()
410+
buildDir := filepath.Join(packageRoot, "_dev", "build")
411+
err := os.MkdirAll(buildDir, 0755)
412+
require.NoError(t, err)
413+
414+
content := `dependencies:
415+
ecs:
416+
reference: git@8.1
417+
`
418+
buildFile := filepath.Join(buildDir, "build.yml")
419+
err = os.WriteFile(buildFile, []byte(content), 0644)
420+
require.NoError(t, err)
365421
}

internal/fields/validate.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,18 @@ type packageRootFinder interface {
260260
FindPackageRoot() (string, error)
261261
}
262262

263-
type packageRoot struct{}
263+
type packageRoot struct {
264+
from string
265+
}
264266

265267
func (p packageRoot) FindPackageRoot() (string, error) {
266-
return packages.FindPackageRoot()
268+
return packages.FindPackageRootFrom(p.from)
267269
}
268270

269271
// CreateValidatorForDirectory function creates a validator for the directory.
270272
func CreateValidatorForDirectory(fieldsParentDir string, opts ...ValidatorOption) (v *Validator, err error) {
271-
p := packageRoot{}
272-
return createValidatorForDirectoryAndPackageRoot(fieldsParentDir, p, opts...)
273+
finder := packageRoot{from: fieldsParentDir}
274+
return createValidatorForDirectoryAndPackageRoot(fieldsParentDir, finder, opts...)
273275
}
274276

275277
func createValidatorForDirectoryAndPackageRoot(fieldsParentDir string, finder packageRootFinder, opts ...ValidatorOption) (v *Validator, err error) {

0 commit comments

Comments
 (0)