go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/projects/blogctl/pkg/engine/engine_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package engine
     9  
    10  import (
    11  	"context"
    12  	"encoding/json"
    13  	"flag"
    14  	"os"
    15  	"testing"
    16  	"time"
    17  
    18  	"github.com/urfave/cli/v2"
    19  
    20  	. "go.charczuk.com/sdk/assert"
    21  
    22  	"go.charczuk.com/projects/blogctl/pkg/config"
    23  	"go.charczuk.com/projects/blogctl/pkg/model"
    24  )
    25  
    26  func TestEngineCreateSlugDefaults(t *testing.T) {
    27  	defaults := config.Config{}
    28  
    29  	e := &Engine{Config: defaults}
    30  	slugTemplate, err := e.ParseSlugTemplate()
    31  	ItsNil(t, err)
    32  
    33  	post := model.Post{
    34  		Meta: model.Meta{
    35  			Title:  "test slug",
    36  			Posted: time.Date(2018, 12, 11, 10, 9, 8, 7, time.UTC),
    37  		},
    38  	}
    39  	ItsEqual(t, "2018/12/11/test-slug", e.CreateSlug(slugTemplate, post))
    40  
    41  	post = model.Post{
    42  		Meta: model.Meta{
    43  			Title:  "Mt. Tam",
    44  			Posted: time.Date(2018, 12, 11, 10, 9, 8, 7, time.UTC),
    45  		},
    46  	}
    47  	ItsEqual(t, "2018/12/11/mt-tam", e.CreateSlug(slugTemplate, post))
    48  }
    49  
    50  func ref[T any](v T) *T { return &v }
    51  
    52  func mockContext(configPath string, parallelism int) *cli.Context {
    53  	set := flag.NewFlagSet("test", 0 /*error handling*/)
    54  	set.String(config.FlagConfig, configPath, "doc")
    55  	set.Int(config.FlagParallelism, parallelism, "doc")
    56  	return cli.NewContext(nil, set, nil)
    57  }
    58  
    59  func TestEngineBuild(t *testing.T) {
    60  	t.Cleanup(func() {
    61  		_ = os.RemoveAll("thumbnails")
    62  		_ = os.RemoveAll("dist")
    63  	})
    64  	ItsNil(t, os.Chdir("testdata"))
    65  
    66  	cfg, flags, paths, err := config.ReadConfig(mockContext("./config.yml", 4))
    67  	ItsNil(t, err)
    68  	ItsEqual(t, []string{"./config.yml", "./config.yml"}, paths)
    69  	ItsEqual(t, "./config.yml", flags.Config)
    70  	ItsEqual(t, 4, flags.Parallelism)
    71  
    72  	ItsNil(t, MustNew(OptConfig(cfg)).Build(context.TODO()))
    73  
    74  	_, err = os.Stat("dist")
    75  	ItsNil(t, err)
    76  	_, err = os.Stat("dist/index.html")
    77  	ItsNil(t, err)
    78  	_, err = os.Stat("dist/data.json")
    79  	ItsNil(t, err)
    80  	_, err = os.Stat("dist/2019/02/10/text-post")
    81  	ItsNil(t, err)
    82  	_, err = os.Stat("dist/2019/02/11/image-post")
    83  	ItsNil(t, err)
    84  	_, err = os.Stat("dist/2019/02/11/image-post/original.jpg")
    85  	ItsNil(t, err)
    86  	_, err = os.Stat("dist/2019/02/11/image-post/2048.jpg")
    87  	ItsNil(t, err)
    88  	_, err = os.Stat("dist/2019/02/11/image-post/1024.jpg")
    89  	ItsNil(t, err)
    90  	_, err = os.Stat("dist/2019/02/11/image-post/512.jpg")
    91  	ItsNil(t, err)
    92  
    93  	f, err := os.Open("dist/data.json")
    94  	ItsNil(t, err)
    95  	defer f.Close()
    96  	var data model.Data
    97  	ItsNil(t, json.NewDecoder(f).Decode(&data))
    98  
    99  	ItsLen(t, data.Posts, 2)
   100  	ItsLen(t, data.Posts[0].Image.Sizes, 4)
   101  	ItsEmpty(t, data.Posts[1].Image.Sizes)
   102  	ItsLen(t, data.Tags, 4)
   103  }