From f940f22d67a2ea3f308d5c2b1ec318e59b54cc86 Mon Sep 17 00:00:00 2001 From: SoXX Date: Fri, 9 Aug 2024 21:38:35 +0200 Subject: [PATCH] chore(impl): removed old functions removed all old implementation of the SDK BREAKING-CHANGE: breaks database compatibility to older SDK versions --- pkg/database/database.go | 36 - pkg/database/post.go | 31 - pkg/database/postgres.go | 268 --- pkg/database/postgres_test.go | 3791 --------------------------------- pkg/database/tag.go | 20 - pkg/database/tagalias.go | 19 - pkg/database/taggroup.go | 19 - pkg/database/user.go | 42 - 8 files changed, 4226 deletions(-) delete mode 100644 pkg/database/database.go delete mode 100644 pkg/database/post.go delete mode 100644 pkg/database/postgres.go delete mode 100644 pkg/database/postgres_test.go delete mode 100644 pkg/database/tag.go delete mode 100644 pkg/database/tagalias.go delete mode 100644 pkg/database/taggroup.go delete mode 100644 pkg/database/user.go diff --git a/pkg/database/database.go b/pkg/database/database.go deleted file mode 100644 index 3a6beeb..0000000 --- a/pkg/database/database.go +++ /dev/null @@ -1,36 +0,0 @@ -package database - -import ( - "context" - "database/sql" - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type OtterSpace interface { - // Connect establishes a connection to the database. - Connect(ctx context.Context, config models.DatabaseConfig) error - - // Post contains all function that are needed to manage Posts - Post - - // User contains all function that are needed to manage the AnthroveUser - User - - // Source contains all function that are needed to manage the Source - Source - - // Tag contains all functions that are used to manage Tag - Tag - - // TagAlias contains all function that are needed to manage the TagAlias - TagAlias - - // TagGroup contains all function that are needed to manage the TagGroup - TagGroup - - // ExecuteRawStatement run a custom query. - ExecuteRawStatement(ctx context.Context, query string, args ...any) error - - // QueryRawStatement runs a custom query and returns the table - QueryRawStatement(ctx context.Context, query string, args ...any) (*sql.Rows, error) -} diff --git a/pkg/database/post.go b/pkg/database/post.go deleted file mode 100644 index f19e70d..0000000 --- a/pkg/database/post.go +++ /dev/null @@ -1,31 +0,0 @@ -package database - -import ( - "context" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type Post interface { - - // CreatePost adds a new post to the database. - CreatePost(ctx context.Context, anthrovePost *models.Post) error - - // TODO: Everything - CreatePostInBatch(ctx context.Context, anthrovePost []models.Post, batchSize int) error - - // GetPostByAnthroveID retrieves a post by its Anthrove ID. - GetPostByAnthroveID(ctx context.Context, anthrovePostID models.AnthrovePostID) (*models.Post, error) - - // GetPostByURL retrieves a post by its source URL. - GetPostByURL(ctx context.Context, postURL string) (*models.Post, error) - - // GetPostBySourceID retrieves a post by its source ID. - GetPostBySourceID(ctx context.Context, sourceID models.AnthroveSourceID) (*models.Post, error) - - // CreatePostWithReferenceToTagAnd adds a tag with a relation to a post. - CreatePostWithReferenceToTagAnd(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *models.Tag) error - - // CreatePostReference links a post with a source. - CreatePostReference(ctx context.Context, anthrovePostID models.AnthrovePostID, sourceDomain models.AnthroveSourceDomain, postURL models.AnthrovePostURL, config models.PostReferenceConfig) error -} diff --git a/pkg/database/postgres.go b/pkg/database/postgres.go deleted file mode 100644 index 001d7b0..0000000 --- a/pkg/database/postgres.go +++ /dev/null @@ -1,268 +0,0 @@ -package database - -import ( - "context" - "database/sql" - "embed" - "fmt" - log2 "log" - "os" - "time" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/internal/postgres" - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" - _ "github.com/lib/pq" - migrate "github.com/rubenv/sql-migrate" - log "github.com/sirupsen/logrus" - gormPostgres "gorm.io/driver/postgres" - "gorm.io/gorm" - gormLogger "gorm.io/gorm/logger" -) - -//go:embed migrations/*.sql -var embedMigrations embed.FS - -type postgresqlConnection struct { - db *gorm.DB - debug bool -} - -func NewPostgresqlConnection() OtterSpace { - return &postgresqlConnection{ - db: nil, - } -} - -func (p *postgresqlConnection) Connect(_ context.Context, config models.DatabaseConfig) error { - var localSSL string - var logLevel gormLogger.LogLevel - - if config.SSL { - localSSL = "require" - } else { - localSSL = "disable" - } - - p.debug = config.Debug - - dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=%s", config.Endpoint, config.Username, config.Password, config.Database, config.Port, localSSL, config.Timezone) - var err error - - if p.debug { - logLevel = gormLogger.Info - } else { - logLevel = gormLogger.Silent - } - - dbLogger := gormLogger.New(log2.New(os.Stdout, "\r\n", log2.LstdFlags), gormLogger.Config{ - SlowThreshold: 200 * time.Millisecond, - LogLevel: logLevel, - IgnoreRecordNotFoundError: true, - Colorful: true, - }) - - db, err := gorm.Open(gormPostgres.Open(dsn), &gorm.Config{ - Logger: dbLogger, - }) - p.db = db - if err != nil { - return err - } - - log.Infof("OtterSpace: database connection established") - - err = p.migrateDatabase(db) - if err != nil { - return err - } - - log.Infof("OtterSpace: migration compleate") - - return nil -} - -func (p *postgresqlConnection) CreateUserWithRelationToSource(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, accountId string, accountUsername string) error { - return postgres.CreateUserWithRelationToSource(ctx, p.db, anthroveUserID, sourceID, accountId, accountUsername) -} - -func (p *postgresqlConnection) CreateSource(ctx context.Context, anthroveSource *models.Source) error { - return postgres.CreateSource(ctx, p.db, anthroveSource) -} - -func (p *postgresqlConnection) CreatePost(ctx context.Context, anthrovePost *models.Post) error { - return postgres.CreatePost(ctx, p.db, anthrovePost) -} - -func (p *postgresqlConnection) CreatePostInBatch(ctx context.Context, anthrovePost []models.Post, batchSize int) error { - return postgres.CreatePostInBatch(ctx, p.db, anthrovePost, batchSize) -} - -func (p *postgresqlConnection) CreatePostWithReferenceToTagAnd(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *models.Tag) error { - return postgres.CreateTagAndReferenceToPost(ctx, p.db, anthrovePostID, anthroveTag) -} - -func (p *postgresqlConnection) CreatePostReference(ctx context.Context, anthrovePostID models.AnthrovePostID, sourceDomain models.AnthroveSourceDomain, postURL models.AnthrovePostURL, config models.PostReferenceConfig) error { - return postgres.CreateReferenceBetweenPostAndSource(ctx, p.db, anthrovePostID, sourceDomain, postURL, config) -} - -func (p *postgresqlConnection) CreateReferenceBetweenUserAndPost(ctx context.Context, anthroveUserID models.AnthroveUserID, anthrovePostID models.AnthrovePostID) error { - return postgres.CreateReferenceBetweenUserAndPost(ctx, p.db, anthroveUserID, anthrovePostID) -} - -func (p *postgresqlConnection) CheckIfUserHasPostAsFavorite(ctx context.Context, anthroveUserID models.AnthroveUserID, anthrovePostID models.AnthrovePostID) (bool, error) { - return postgres.CheckReferenceBetweenUserAndPost(ctx, p.db, anthroveUserID, anthrovePostID) -} - -func (p *postgresqlConnection) GetPostByAnthroveID(ctx context.Context, anthrovePostID models.AnthrovePostID) (*models.Post, error) { - return postgres.GetPostByAnthroveID(ctx, p.db, anthrovePostID) -} - -func (p *postgresqlConnection) GetPostByURL(ctx context.Context, sourceUrl string) (*models.Post, error) { - return postgres.GetPostBySourceURL(ctx, p.db, sourceUrl) -} - -func (p *postgresqlConnection) GetPostBySourceID(ctx context.Context, sourceID models.AnthroveSourceID) (*models.Post, error) { - return postgres.GetPostBySourceID(ctx, p.db, sourceID) -} - -func (p *postgresqlConnection) GetUserFavoritesCount(ctx context.Context, anthroveUserID models.AnthroveUserID) (int64, error) { - return postgres.GetUserFavoritesCount(ctx, p.db, anthroveUserID) -} - -func (p *postgresqlConnection) GetAllUserSources(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]models.UserSource, error) { - return postgres.GetUserSourceLinks(ctx, p.db, anthroveUserID) -} - -func (p *postgresqlConnection) GetUserSourceBySourceID(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID) (*models.UserSource, error) { - return postgres.GetUserSourceBySourceID(ctx, p.db, anthroveUserID, sourceID) -} - -func (p *postgresqlConnection) GetAllUsers(ctx context.Context) ([]models.User, error) { - return postgres.GetAllUsers(ctx, p.db) -} - -func (p *postgresqlConnection) GetAllUserFavoritesWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error) { - return postgres.GetUserFavoriteWithPagination(ctx, p.db, anthroveUserID, skip, limit) -} - -func (p *postgresqlConnection) GetAllTagsFromUser(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]models.TagsWithFrequency, error) { - return postgres.GetUserTagWitRelationToFavedPosts(ctx, p.db, anthroveUserID) -} - -func (p *postgresqlConnection) GetAllTags(ctx context.Context) ([]models.Tag, error) { - return postgres.GetTags(ctx, p.db) -} - -func (p *postgresqlConnection) GetAllSources(ctx context.Context) ([]models.Source, error) { - return postgres.GetAllSource(ctx, p.db) -} - -func (p *postgresqlConnection) GetSourceByDomain(ctx context.Context, sourceDomain models.AnthroveSourceDomain) (*models.Source, error) { - return postgres.GetSourceByDomain(ctx, p.db, sourceDomain) -} - -func (p *postgresqlConnection) UpdateUserSourceScrapeTimeInterval(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, scrapeTime models.AnthroveScrapeTimeInterval) error { - return postgres.UpdateUserSourceScrapeTimeInterval(ctx, p.db, anthroveUserID, sourceID, scrapeTime) -} - -func (p *postgresqlConnection) UpdateUserSourceLastScrapeTime(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, lastScrapeTime models.AnthroveUserLastScrapeTime) error { - return postgres.UpdateUserSourceLastScrapeTime(ctx, p.db, anthroveUserID, sourceID, lastScrapeTime) -} - -func (p *postgresqlConnection) UpdateUserSourceValidation(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, valid bool) error { - return postgres.UpdateUserSourceValidation(ctx, p.db, anthroveUserID, sourceID, valid) -} - -func (p *postgresqlConnection) CreateTagAlias(ctx context.Context, tagAliasName models.AnthroveTagAliasName, tagID models.AnthroveTagID) error { - return postgres.CreateTagAlias(ctx, p.db, tagAliasName, tagID) -} - -func (p *postgresqlConnection) GetAllTagAlias(ctx context.Context) ([]models.TagAlias, error) { - return postgres.GetAllTagAlias(ctx, p.db) -} - -func (p *postgresqlConnection) GetAllTagAliasByTag(ctx context.Context, tagID models.AnthroveTagID) ([]models.TagAlias, error) { - return postgres.GetAllTagAliasByTag(ctx, p.db, tagID) -} - -func (p *postgresqlConnection) DeleteTagAlias(ctx context.Context, tagAliasName models.AnthroveTagAliasName) error { - return postgres.DeleteTagAlias(ctx, p.db, tagAliasName) -} - -func (p *postgresqlConnection) CreateTagGroup(ctx context.Context, tagGroupName models.AnthroveTagGroupName, tagID models.AnthroveTagID) error { - return postgres.CreateTagGroup(ctx, p.db, tagGroupName, tagID) -} - -func (p *postgresqlConnection) GetAllTagGroup(ctx context.Context) ([]models.TagGroup, error) { - return postgres.GetAllTagGroup(ctx, p.db) -} - -func (p *postgresqlConnection) GetAllTagGroupByTag(ctx context.Context, tagID models.AnthroveTagID) ([]models.TagGroup, error) { - return postgres.GetAllTagGroupByTag(ctx, p.db, tagID) -} - -func (p *postgresqlConnection) DeleteTagGroup(ctx context.Context, tagGroupName models.AnthroveTagGroupName) error { - return postgres.DeleteTagGroup(ctx, p.db, tagGroupName) -} - -func (p *postgresqlConnection) CreateTag(ctx context.Context, tagName models.AnthroveTagName, tagType models.TagType) error { - return postgres.CreateTag(ctx, p.db, tagName, tagType) -} - -func (p *postgresqlConnection) GetAllTagsByTagType(ctx context.Context, tagType models.TagType) ([]models.Tag, error) { - return postgres.GetAllTagByTagsType(ctx, p.db, tagType) -} - -func (p *postgresqlConnection) DeleteTag(ctx context.Context, tagName models.AnthroveTagName) error { - return postgres.DeleteTag(ctx, p.db, tagName) -} - -func (p *postgresqlConnection) CreateTagInBatchAndUpdate(ctx context.Context, tags []models.Tag, batchSize int) error { - return postgres.CreateTagInBatchAndUpdate(ctx, p.db, tags, batchSize) -} - -func (p *postgresqlConnection) CreateTagAliasInBatch(ctx context.Context, tagAliases []models.TagAlias, batchSize int) error { - return postgres.CreateTagAliasInBatch(ctx, p.db, tagAliases, batchSize) -} - -func (p *postgresqlConnection) CreateTagGroupInBatch(ctx context.Context, tagGroups []models.TagGroup, batchSize int) error { - return postgres.CreateTagGroupInBatch(ctx, p.db, tagGroups, batchSize) - -} - -func (p *postgresqlConnection) ExecuteRawStatement(ctx context.Context, query string, args ...any) error { - return postgres.ExecuteRawStatement(ctx, p.db, query, args...) -} - -func (p *postgresqlConnection) QueryRawStatement(ctx context.Context, query string, args ...any) (*sql.Rows, error) { - return postgres.QueryRawStatement(ctx, p.db, query, args...) -} - -// HELPER - -func (p *postgresqlConnection) migrateDatabase(dbPool *gorm.DB) error { - dialect := "postgres" - migrations := &migrate.EmbedFileSystemMigrationSource{FileSystem: embedMigrations, Root: "migrations"} - - db, err := dbPool.DB() - if err != nil { - return fmt.Errorf("postgres migration: %v", err) - } - - n, err := migrate.Exec(db, dialect, migrations, migrate.Up) - if err != nil { - return fmt.Errorf("postgres migration: %v", err) - } - - if p.debug { - if n != 0 { - log.Infof("postgres migration: applied %d migrations!", n) - - } else { - log.Info("postgres migration: nothing to migrate") - - } - } - - return nil -} diff --git a/pkg/database/postgres_test.go b/pkg/database/postgres_test.go deleted file mode 100644 index 221b882..0000000 --- a/pkg/database/postgres_test.go +++ /dev/null @@ -1,3791 +0,0 @@ -package database - -import ( - "context" - "database/sql" - "fmt" - "reflect" - "testing" - "time" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/internal/postgres" - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" - "git.anthrove.art/Anthrove/otter-space-sdk/v2/test" - "gorm.io/gorm" -) - -func TestNewPostgresqlConnection(t *testing.T) { - // Test - tests := []struct { - name string - want OtterSpace - }{ - { - name: "Test 1: Create new postgresql connection", - want: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if tt.want != NewPostgresqlConnection() { - } else { - t.Errorf("NewPostgresqlConnection() = %s", tt.want) - } - }) - } -} - -func Test_postgresqlConnection_Connect(t *testing.T) { - - // Setup trow away container - ctx := context.Background() - container, _, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - - dbConfig, err := test.DatabaseModesFromConnectionString(ctx, container) - if err != nil { - t.Fatalf("Could not parse database config: %v", err) - } - - // Test - type args struct { - in0 context.Context - config models.DatabaseConfig - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Connect to postgresql connection", - args: args{ - in0: ctx, - config: *dbConfig, - }, - wantErr: false, - }, - { - name: "Test 1: Empty connection config", - args: args{ - in0: ctx, - config: models.DatabaseConfig{}, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{} - if err := p.Connect(tt.args.in0, tt.args.config); (err != nil) != tt.wantErr { - t.Errorf("Connect() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateUserWithRelationToSource(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - validSourceID1 := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ID: validSourceID1}, - DisplayName: "e621", - Domain: "e621.net", - Icon: "icon.e621.net", - } - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - sourceID models.AnthroveSourceID - accountId string - accountUsername string - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid anthroveUserID, sourceID, accountId, accountUsername", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: source.ID, - accountId: "e1", - accountUsername: "marius", - }, - wantErr: false, - }, - { - name: "Test 2: Invalid anthroveUserID, valid sourceID, accountId, accountUsername", - args: args{ - ctx: ctx, - anthroveUserID: "2", - sourceID: source.ID, - accountId: "e1", - accountUsername: "marius", - }, - wantErr: true, - }, - { - name: "Test 3: Empty anthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: source.ID, - accountId: "e1", - accountUsername: "marius", - }, - wantErr: true, - }, - { - name: "Test 4: invalid sourceID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "fa.net", - accountId: "e1", - accountUsername: "marius", - }, - wantErr: true, - }, - { - name: "Test 5: no accountId", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: source.ID, - accountId: "", - accountUsername: "marius", - }, - wantErr: true, - }, - { - name: "Test 6: no accountUsername", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: source.ID, - accountId: "aa", - accountUsername: "", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateUserWithRelationToSource(tt.args.ctx, tt.args.anthroveUserID, tt.args.sourceID, tt.args.accountId, tt.args.accountUsername); (err != nil) != tt.wantErr { - t.Errorf("CreateUserWithRelationToSource() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateSource(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validSource := &models.Source{ - DisplayName: "e621", - Domain: "e621.net", - Icon: "icon.e621.net", - } - - invalidSource := &models.Source{ - Domain: "", - } - - // Test - type args struct { - ctx context.Context - anthroveSource *models.Source - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid anthroveSource", - args: args{ - ctx: ctx, - anthroveSource: validSource, - }, - wantErr: false, - }, - { - name: "Test 2: inValid anthroveSource", - args: args{ - ctx: ctx, - anthroveSource: invalidSource, - }, - wantErr: true, - }, - { - name: "Test 3: unique anthroveSource", - args: args{ - ctx: ctx, - anthroveSource: validSource, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateSource(tt.args.ctx, tt.args.anthroveSource); (err != nil) != tt.wantErr { - t.Errorf("CreateSource() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreatePost(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - validPost := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - invalidPost := &models.Post{ - Rating: "error", - } - - // Test - type args struct { - ctx context.Context - anthrovePost *models.Post - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid AnthrovePostID and Rating", - args: args{ - ctx: context.Background(), - anthrovePost: validPost, - }, - wantErr: false, - }, - { - name: "Test 2: Invalid Rating", - args: args{ - ctx: context.Background(), - anthrovePost: invalidPost, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreatePost(tt.args.ctx, tt.args.anthrovePost); (err != nil) != tt.wantErr { - t.Errorf("CreatePost() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateTagAndReferenceToPost(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal(err) - } - - tag := &models.Tag{ - Name: "JayTheFerret", - Type: "artist", - } - - // Test - type args struct { - ctx context.Context - anthrovePostID models.AnthrovePostID - anthroveTag *models.Tag - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid PostID and Tag", - args: args{ - ctx: ctx, - anthrovePostID: post.ID, - anthroveTag: tag, - }, - wantErr: false, - }, - { - name: "Test 2: Valid PostID and no Tag", - args: args{ - ctx: ctx, - anthrovePostID: post.ID, - anthroveTag: nil, - }, - wantErr: true, - }, - { - name: "Test 3: Invalid PostID and valid Tag", - args: args{ - ctx: ctx, - anthrovePostID: "123456", - anthroveTag: tag, - }, - wantErr: true, - }, - { - name: "Test 4: No PostID and valid Tag", - args: args{ - ctx: ctx, - anthrovePostID: "", - anthroveTag: tag, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreatePostWithReferenceToTagAnd(tt.args.ctx, tt.args.anthrovePostID, tt.args.anthroveTag); (err != nil) != tt.wantErr { - t.Errorf("CreatePostWithReferenceToTagAnd() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - validSourceID1 := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ID: validSourceID1}, - DisplayName: "e621", - Domain: "e621.net", - Icon: "icon.e621.net", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthrovePostID models.AnthrovePostID - sourceDomain models.AnthroveSourceDomain - postURl models.AnthrovePostURL - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid AnthrovePostID and anthroveSourceDomain", - args: args{ - ctx: ctx, - anthrovePostID: post.ID, - sourceDomain: "e621.net", - postURl: "http://e621.net/post/eeasd", - }, - wantErr: false, - }, - { - name: "Test 2: Invalid AnthrovePostID and Valid anthroveSourceDomain", - args: args{ - ctx: ctx, - anthrovePostID: "123456", - sourceDomain: "e621.net", - postURl: "", - }, - wantErr: true, - }, - { - name: "Test 3: Invalid anthroveSourceDomain and Valid AnthrovePostID", - args: args{ - ctx: ctx, - anthrovePostID: "1234", - sourceDomain: "fa.banana", - postURl: "", - }, - wantErr: true, - }, - { - name: "Test 4: Invalid anthroveSourceDomain and Invalid AnthrovePostID", - args: args{ - ctx: ctx, - anthrovePostID: "696969", - postURl: "", - }, - wantErr: true, - }} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreatePostReference(tt.args.ctx, tt.args.anthrovePostID, tt.args.sourceDomain, tt.args.postURl, models.PostReferenceConfig{}); (err != nil) != tt.wantErr { - t.Errorf("CreatePostReference() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateReferenceBetweenUserAndPost(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - err = postgres.CreateUser(ctx, gormDB, validUserID) - if err != nil { - t.Fatal(err) - } - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - anthrovePostID models.AnthrovePostID - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveUserID and AnthrovePostID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - anthrovePostID: post.ID, - }, - wantErr: false, - }, - { - name: "Test 2: Valid AnthroveUserID and invalid AnthrovePostID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - anthrovePostID: "123456", - }, - wantErr: true, - }, - { - name: "Test 3: Valid AnthrovePostID and invalid AnthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: "123", - anthrovePostID: "1234", - }, - wantErr: true, - }, - { - name: "Test 4: Invalid AnthrovePostID and invalid AnthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: "123", - anthrovePostID: "123456", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateReferenceBetweenUserAndPost(tt.args.ctx, tt.args.anthroveUserID, tt.args.anthrovePostID); (err != nil) != tt.wantErr { - t.Errorf("CreateReferenceBetweenUserAndPost() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CheckReferenceBetweenUserAndPost(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - err = postgres.CreateUser(ctx, gormDB, validUserID) - if err != nil { - t.Fatal(err) - } - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateReferenceBetweenUserAndPost(ctx, gormDB, validUserID, post.ID) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - anthrovePostID models.AnthrovePostID - } - tests := []struct { - name string - args args - want bool - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveUserID and AnthrovePostID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - anthrovePostID: post.ID, - }, - want: true, - wantErr: false, - }, - { - name: "Test 2: Valid AnthroveUserID and invalid AnthrovePostID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - anthrovePostID: "qadw", - }, - want: false, - wantErr: true, - }, - { - name: "Test 3: Valid AnthrovePostID and invalid AnthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: "123", - anthrovePostID: post.ID, - }, - want: false, - wantErr: true, - }, - { - name: "Test 4: Invalid AnthrovePostID and invalid AnthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: "123", - anthrovePostID: "123456", - }, - want: false, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.CheckIfUserHasPostAsFavorite(tt.args.ctx, tt.args.anthroveUserID, tt.args.anthrovePostID) - if (err != nil) != tt.wantErr { - t.Errorf("CheckIfUserHasPostAsFavorite() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("CheckIfUserHasPostAsFavorite() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetPostByAnthroveID(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal("Could not create post", err) - } - - // Test - type args struct { - ctx context.Context - anthrovePost models.AnthrovePostID - } - tests := []struct { - name string - args args - want *models.Post - wantErr bool - }{ - { - name: "Test 1: Valid anthrovePostID", - args: args{ - ctx: ctx, - anthrovePost: post.ID, - }, - want: post, - wantErr: false, - }, - { - name: "Test 2: No anthrovePostID", - args: args{ - ctx: ctx, - anthrovePost: "nil", - }, - want: nil, - wantErr: true, - }} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetPostByAnthroveID(tt.args.ctx, tt.args.anthrovePost) - if (err != nil) != tt.wantErr { - t.Errorf("GetPostByAnthroveID() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkPost(got, tt.want) { - t.Errorf("GetPostByAnthroveID() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetPostByURL(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal("Could not create post", err) - } - - source := models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: models.AnthroveSourceID(fmt.Sprintf("%025s", "1")), - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.net/icon.ico", - } - - err = postgres.CreateSource(ctx, gormDB, &source) - if err != nil { - t.Fatal("Could not create source", err) - } - - err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "https://e62asdwad.com/asdas", models.PostReferenceConfig{}) - if err != nil { - t.Fatal("Could not create source reference", err) - } - - // Test - type args struct { - ctx context.Context - sourceUrl string - } - tests := []struct { - name string - args args - want *models.Post - wantErr bool - }{ - { - name: "Test 1: Valid sourceUrl", - args: args{ - ctx: ctx, - sourceUrl: "https://e62asdwad.com/asdas", - }, - want: post, - wantErr: false, - }, - { - name: "Test 2: Invalid sourceUrl", - args: args{ - ctx: ctx, - sourceUrl: "1234", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: No sourceUrl", - args: args{ - ctx: ctx, - sourceUrl: "", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetPostByURL(tt.args.ctx, tt.args.sourceUrl) - if (err != nil) != tt.wantErr { - t.Errorf("GetPostBySourceURL() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkPost(got, tt.want) { - t.Errorf("GetPostBySourceURL() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetPostBySourceID(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - validSourceID1 := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - post := &models.Post{ - BaseModel: models.BaseModel[models.AnthrovePostID]{ - ID: validPostID1, - }, - Rating: "safe", - } - - source := models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: validSourceID1, - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.net/icon.ico", - } - - err = postgres.CreatePost(ctx, gormDB, post) - if err != nil { - t.Fatal("Could not create post", err) - } - - err = postgres.CreateSource(ctx, gormDB, &source) - if err != nil { - t.Fatal("Could not create source", err) - } - - err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "https://easd15aed.de/asd", models.PostReferenceConfig{}) - if err != nil { - t.Fatal("Could not create source reference", err) - } - - // Test - type args struct { - ctx context.Context - sourceID models.AnthroveSourceID - } - tests := []struct { - name string - args args - want *models.Post - wantErr bool - }{ - { - name: "Test 1: Valid sourceID", - args: args{ - ctx: ctx, - sourceID: source.ID, - }, - want: post, - wantErr: false, - }, - { - name: "Test 2: Invalid sourceID", - args: args{ - ctx: ctx, - sourceID: "1234", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: No sourceID", - args: args{ - ctx: ctx, - sourceID: "", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetPostBySourceID(tt.args.ctx, tt.args.sourceID) - if (err != nil) != tt.wantErr { - t.Errorf("GetPostBySourceID() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkPost(got, tt.want) { - t.Errorf("GetPostBySourceID() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetUserFavoritesCount(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validAnthroveUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - validPostID2 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post2")) - validPostID3 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post3")) - validPostID4 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post4")) - validPostID5 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post5")) - validPostID6 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post6")) - - expectedResultPosts := []models.Post{ - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID1}, - Rating: "safe", - }, - { - - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID2}, - Rating: "safe", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID3}, - Rating: "explicit", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID4}, - Rating: "explicit", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID5}, - Rating: "questionable", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID6}, - Rating: "safe", - }, - } - - err = postgres.CreateUser(ctx, gormDB, validAnthroveUserID) - if err != nil { - t.Fatal(err) - } - - for _, post := range expectedResultPosts { - err = postgres.CreatePost(ctx, gormDB, &post) - if err != nil { - t.Fatal(err) - } - err = postgres.CreateReferenceBetweenUserAndPost(ctx, gormDB, validAnthroveUserID, post.ID) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - } - tests := []struct { - name string - args args - want int64 - wantErr bool - }{ - { - name: "Test 1: Valid anthroveUserID and 6 favorite posts", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - }, - want: 6, - wantErr: false, - }, - { - name: "Test 2: Invalid anthroveUserID and 6 favorite posts", - args: args{ - ctx: ctx, - anthroveUserID: "2", - }, - want: 0, - wantErr: true, - }, - { - name: "Test 3: no anthroveUserID and 6 favorite posts", - args: args{ - ctx: ctx, - anthroveUserID: "", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetUserFavoritesCount(tt.args.ctx, tt.args.anthroveUserID) - if (err != nil) != tt.wantErr { - t.Errorf("GetUserFavoritesCount() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("GetUserFavoritesCount() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetUserSourceLinks(t *testing.T) { - // Setup trow away containert - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validAnthroveUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - - validSourceID1 := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - validSourceID2 := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source2")) - - eSource := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ID: validSourceID1}, - DisplayName: "e621", - Domain: "e621.net", - } - err = postgres.CreateSource(ctx, gormDB, eSource) - if err != nil { - t.Fatal(err) - } - - faSource := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ID: validSourceID2}, - DisplayName: "fa", - Domain: "fa.net", - } - err = postgres.CreateSource(ctx, gormDB, faSource) - if err != nil { - t.Fatal(err) - } - - expectedResult := make(map[string]models.UserSource) - expectedResult["e621"] = models.UserSource{ - UserID: "e1", - AccountUsername: "e621-user", - Source: models.Source{ - DisplayName: eSource.DisplayName, - Domain: eSource.Domain, - }, - } - expectedResult["fa"] = models.UserSource{ - UserID: "fa1", - AccountUsername: "fa-user", - Source: models.Source{ - DisplayName: faSource.DisplayName, - Domain: faSource.Domain, - }, - } - - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validAnthroveUserID, eSource.ID, expectedResult["e621"].UserID, expectedResult["e621"].AccountUsername) - if err != nil { - t.Fatal(err) - } - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validAnthroveUserID, faSource.ID, expectedResult["fa"].UserID, expectedResult["fa"].AccountUsername) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - } - tests := []struct { - name string - args args - want map[string]models.UserSource - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - }, - want: expectedResult, - wantErr: false, - }} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllUserSources(tt.args.ctx, tt.args.anthroveUserID) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllUserSources() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllUserSources() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetUserSourceBySourceID(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - invalidUserID := models.AnthroveUserID("XXX") - - validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: validSourceID, - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.icon", - } - - expectedResult := &models.UserSource{ - UserID: string(validUserID), - AccountUsername: "euser", - Source: models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ID: source.ID}, - DisplayName: source.DisplayName, - Domain: source.Domain, - Icon: source.Icon, - }, - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, expectedResult.UserID, expectedResult.AccountUsername) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - sourceID models.AnthroveSourceID - } - - tests := []struct { - name string - args args - want *models.UserSource - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveUserID and sourceID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: source.ID, - }, - want: expectedResult, - wantErr: false, - }, - { - name: "Test 2: Invalid AnthroveUserID and valid sourceID", - args: args{ - ctx: ctx, - anthroveUserID: invalidUserID, - sourceID: source.ID, - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: Valid AnthroveUserID and invalid sourceID", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "fa", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 4: No AnthroveUserID and Valid sourceID", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: source.ID, - }, - want: nil, - wantErr: true, - }, - { - name: "Test 5: Valid AnthroveUserID and No SourceDisplayName", - args: args{ - ctx: ctx, - anthroveUserID: "1", - sourceID: "", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 6: No AnthroveUserID and No SourceDisplayName", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: "", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetUserSourceBySourceID(tt.args.ctx, tt.args.anthroveUserID, tt.args.sourceID) - if (err != nil) != tt.wantErr { - t.Errorf("GetUserSourceBySourceID() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkUserSource(got, tt.want) { - t.Errorf("GetUserSourceBySourceID() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetAllUsers(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validUserID01 := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - validUserID02 := models.AnthroveUserID(fmt.Sprintf("%025s", "User2")) - validUserID03 := models.AnthroveUserID(fmt.Sprintf("%025s", "User3")) - - users := []models.User{ - { - BaseModel: models.BaseModel[models.AnthroveUserID]{ID: validUserID01}, - }, - { - BaseModel: models.BaseModel[models.AnthroveUserID]{ID: validUserID02}, - }, - { - BaseModel: models.BaseModel[models.AnthroveUserID]{ID: validUserID03}, - }, - } - - for _, user := range users { - err = postgres.CreateUser(ctx, gormDB, user.ID) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - } - tests := []struct { - name string - args args - want []models.User - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ - ctx: ctx, - }, - want: users, - wantErr: false, - }} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllUsers(tt.args.ctx) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllUsers() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkUser(got, tt.want) { - t.Errorf("GetAllUsers() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetUserFavoriteWithPagination(t *testing.T) { - // Setup trow away containert - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validAnthroveUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - validPostID2 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post2")) - validPostID3 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post3")) - validPostID4 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post4")) - validPostID5 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post5")) - validPostID6 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post6")) - - expectedResultPosts := []models.Post{ - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID1}, - Rating: "safe", - }, - { - - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID2}, - Rating: "safe", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID3}, - Rating: "explicit", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID4}, - Rating: "explicit", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID5}, - Rating: "questionable", - }, - { - BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID6}, - Rating: "safe", - }, - } - expectedResult := &models.FavoriteList{ - Posts: expectedResultPosts, - } - expectedResult2 := &models.FavoriteList{ - Posts: expectedResultPosts[2:], - } - expectedResult3 := &models.FavoriteList{ - Posts: expectedResultPosts[:3], - } - - err = postgres.CreateUser(ctx, gormDB, validAnthroveUserID) - if err != nil { - t.Fatal(err) - } - - for _, expectedResultPost := range expectedResultPosts { - err = postgres.CreatePost(ctx, gormDB, &expectedResultPost) - if err != nil { - t.Fatal(err) - } - err = postgres.CreateReferenceBetweenUserAndPost(ctx, gormDB, validAnthroveUserID, expectedResultPost.ID) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - skip int - limit int - } - tests := []struct { - name string - args args - want *models.FavoriteList - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveUserID", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - skip: 0, - limit: 2000, - }, - want: expectedResult, - wantErr: false, - }, - { - name: "Test 2: Skip first two", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - skip: 2, - limit: 2000, - }, - want: expectedResult2, - wantErr: false, - }, - { - name: "Test 3: Limit of 3", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - skip: 0, - limit: 3, - }, - want: expectedResult3, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllUserFavoritesWithPagination(tt.args.ctx, tt.args.anthroveUserID, tt.args.skip, tt.args.limit) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllUserFavoritesWithPagination() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkFavoritePosts(got, tt.want) { - t.Errorf("GetAllUserFavoritesWithPagination() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetUserTagWitRelationToFavedPosts(t *testing.T) { - // Setup trow away containert - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validAnthroveUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - - validPostID1 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post1")) - validPostID2 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post2")) - validPostID3 := models.AnthrovePostID(fmt.Sprintf("%025s", "Post3")) - - err = postgres.CreateUser(ctx, gormDB, validAnthroveUserID) - if err != nil { - t.Fatal(err) - } - - posts := []models.Post{ - {BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID1}, Rating: "safe"}, - {BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID2}, Rating: "safe"}, - {BaseModel: models.BaseModel[models.AnthrovePostID]{ID: validPostID3}, Rating: "explicit"}, - } - - for _, post := range posts { - err = postgres.CreatePost(ctx, gormDB, &post) - if err != nil { - t.Fatal(err) - } - err = postgres.CreateReferenceBetweenUserAndPost(ctx, gormDB, validAnthroveUserID, models.AnthrovePostID(post.ID)) - if err != nil { - t.Fatal(err) - } - } - - tags := []models.Tag{ - {Name: "JayTheFerret", Type: "artist"}, - {Name: "Ferret", Type: "species"}, - {Name: "Jay", Type: "character"}, - } - - for i, tag := range tags { - err = postgres.CreateTagAndReferenceToPost(ctx, gormDB, posts[i].ID, &tag) - if err != nil { - t.Fatal(err) - } - } - - expectedResult := []models.TagsWithFrequency{ - { - Frequency: 1, - Tags: models.Tag{ - Name: tags[0].Name, - Type: tags[0].Type, - }, - }, - { - Frequency: 1, - Tags: models.Tag{ - Name: tags[2].Name, - Type: tags[2].Type, - }, - }, - { - Frequency: 1, - Tags: models.Tag{ - Name: tags[1].Name, - Type: tags[1].Type, - }, - }, - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - } - tests := []struct { - name string - args args - want []models.TagsWithFrequency - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ - ctx: ctx, - anthroveUserID: validAnthroveUserID, - }, - want: expectedResult, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagsFromUser(tt.args.ctx, tt.args.anthroveUserID) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagsFromUser() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagsFromUser() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTags(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - tags := []models.Tag{ - { - Name: "JayTheFerret", - Type: "artist", - }, - { - Name: "anthro", - Type: "general", - }, - { - Name: "soxx", - Type: "character", - }, - } - - for _, tag := range tags { - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(tag.Name), tag.Type) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - } - tests := []struct { - name string - args args - want []models.Tag - wantErr bool - }{ - { - name: "Test 1: Get Tags", - args: args{ - ctx: ctx, - }, - want: tags, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTags(tt.args.ctx) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTags() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTags() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetAllSources(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - sources := []models.Source{ - { - DisplayName: "e621", - Domain: "e621.net", - Icon: "icon.e621.net", - }, - { - DisplayName: "furaffinity", - Domain: "furaffinity.net", - Icon: "icon.furaffinity.net", - }, - { - DisplayName: "fenpaws", - Domain: "fenpa.ws", - Icon: "icon.fenpa.ws", - }, - } - - for _, source := range sources { - err = postgres.CreateSource(ctx, gormDB, &source) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - } - tests := []struct { - name string - args args - want []models.Source - wantErr bool - }{ - { - name: "Test 1: Get all entries", - args: args{ - ctx: ctx, - }, - want: sources, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllSources(tt.args.ctx) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllSources() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkSources(got, tt.want) { - t.Errorf("GetAllSources() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetSourceByDomain(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - source := &models.Source{ - DisplayName: "e621", - Domain: "e621.net", - Icon: "icon.e621.net", - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - sourceDomain models.AnthroveSourceDomain - } - tests := []struct { - name string - args args - want *models.Source - wantErr bool - }{ - { - name: "Test 1: Valid URL", - args: args{ - ctx: ctx, - sourceDomain: "e621.net", - }, - want: source, - wantErr: false, - }, - { - name: "Test 2: Invalid URL", - args: args{ - ctx: ctx, - sourceDomain: "eeeee.net", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 2: No URL", - args: args{ - ctx: ctx, - sourceDomain: "", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetSourceByDomain(tt.args.ctx, tt.args.sourceDomain) - if (err != nil) != tt.wantErr { - t.Errorf("GetSourceByDomain() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !checkSource(got, tt.want) { - t.Errorf("GetSourceByDomain() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_migrateDatabase(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - // Test - type args struct { - dbPool *gorm.DB - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Migrate Databases", - args: args{dbPool: gormDB}, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.migrateDatabase(tt.args.dbPool); (err != nil) != tt.wantErr { - t.Errorf("migrateDatabase() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -// Helper functions for validation purposes -func checkSource(got *models.Source, want *models.Source) bool { - - if want == nil && got == nil { - return true - } - - if got.Domain != want.Domain { - return false - } - - return true - -} -func checkPost(got *models.Post, want *models.Post) bool { - - if got == nil && want == nil { - return true - } else if got == nil || want == nil { - return false - } - - if got.ID != want.ID { - return false - } - - if got.Rating != want.Rating { - return false - } - - return true -} -func checkSources(got []models.Source, want []models.Source) bool { - for i, source := range want { - if source.DisplayName != got[i].DisplayName { - return false - } - if source.Domain != got[i].Domain { - return false - } - if source.Icon != got[i].Icon { - return false - } - } - - return true -} -func checkUser(got []models.User, want []models.User) bool { - for i, user := range want { - if user.ID != got[i].ID { - return false - } - } - return true -} -func checkUserSource(got *models.UserSource, want *models.UserSource) bool { - - if got == nil && want == nil { - return true - } else if got == nil || want == nil { - return false - } - - if got.UserID != want.UserID { - return false - } - if got.AccountUsername != want.AccountUsername { - return false - } - if got.Source.DisplayName != want.Source.DisplayName { - return false - } - if got.Source.Domain != want.Source.Domain { - return false - } - if got.Source.Icon != want.Source.Icon { - return false - } - - return true -} - -//------------------------- - -func Test_postgresqlConnection_CreateTagAlias(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validTagAliasName01 := models.AnthroveTagAliasName("httyd") - validTagAliasName02 := models.AnthroveTagAliasName("dragon") - - validTagID := models.AnthroveTagID("toothless") - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - tagAliasName models.AnthroveTagAliasName - tagID models.AnthroveTagID - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - tagAliasName: validTagAliasName01, - tagID: validTagID, - }, - wantErr: false, - }, - { - name: "Test 2: No TagAliasName", - args: args{ - ctx: ctx, - tagAliasName: "", - tagID: validTagID, - }, - wantErr: true, - }, - { - name: "Test 4: No tagID", - args: args{ - ctx: ctx, - tagAliasName: validTagAliasName01, - tagID: "", - }, - wantErr: true, - }, - { - name: "Test 6: Invalide tagID", - args: args{ - ctx: ctx, - tagAliasName: validTagAliasName02, - tagID: "aaa", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateTagAlias(tt.args.ctx, tt.args.tagAliasName, tt.args.tagID); (err != nil) != tt.wantErr { - t.Errorf("CreateTagAlias() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateTagAliasInBatch(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - tags := []models.Tag{ - { - Name: "JayTheFerret", - Type: models.Artist, - }, - { - Name: "SoXX", - Type: models.Character, - }, - { - Name: "Dragon", - Type: models.Species, - }, - { - Name: "Fennec", - Type: models.Species, - }, - } - err = postgres.CreateTagInBatchAndUpdate(ctx, gormDB, tags, len(tags)) - if err != nil { - t.Fatal(err) - } - - tagAlias := []models.TagAlias{ - { - Name: "test1", - TagID: tags[0].Name, - }, - { - Name: "test2", - TagID: tags[1].Name, - }, - { - Name: "test3", - TagID: tags[2].Name, - }, - { - Name: "test4", - TagID: tags[3].Name, - }, - } - emptyTagAlias := []models.TagAlias{} - - // Test - type args struct { - ctx context.Context - tagAliases []models.TagAlias - batchSize int - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Tags", - args: args{ - ctx: ctx, - tagAliases: tagAlias, - batchSize: 10, - }, - wantErr: false, - }, - { - name: "Test 2: Empty Tags", - args: args{ - ctx: ctx, - tagAliases: emptyTagAlias, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 3: Nil Tags", - args: args{ - ctx: ctx, - tagAliases: nil, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 4: No batchSize", - args: args{ - ctx: ctx, - tagAliases: tagAlias, - batchSize: 0, - }, - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateTagAliasInBatch(tt.args.ctx, tt.args.tagAliases, tt.args.batchSize); (err != nil) != tt.wantErr { - t.Errorf("CreateTagAliasInBatch() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTagAlias(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagAliases := []models.AnthroveTagAliasName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - expectedResult := []models.TagAlias{ - { - Name: string(validTagAliases[0]), - TagID: string(validTagID), - }, - { - Name: string(validTagAliases[1]), - TagID: string(validTagID), - }, - { - Name: string(validTagAliases[2]), - TagID: string(validTagID), - }, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagAliasName := range validTagAliases { - err = postgres.CreateTagAlias(ctx, gormDB, tagAliasName, validTagID) - } - - // Test - type args struct { - ctx context.Context - } - tests := []struct { - name string - args args - want []models.TagAlias - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ctx: ctx}, - want: expectedResult, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagAlias(tt.args.ctx) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagAlias() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagAlias() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTagAliasByTag(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagAliases := []models.AnthroveTagAliasName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - expectedResult := []models.TagAlias{ - { - Name: string(validTagAliases[0]), - TagID: string(validTagID), - }, - { - Name: string(validTagAliases[1]), - TagID: string(validTagID), - }, - { - Name: string(validTagAliases[2]), - TagID: string(validTagID), - }, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagAliasName := range validTagAliases { - err = postgres.CreateTagAlias(ctx, gormDB, tagAliasName, validTagID) - } - - // Test - type args struct { - ctx context.Context - tagID models.AnthroveTagID - } - tests := []struct { - name string - args args - want []models.TagAlias - wantErr bool - }{ - { - name: "Test 1: Valid TagID", - args: args{ - ctx: ctx, - tagID: validTagID, - }, - want: expectedResult, - wantErr: false, - }, - { - name: "Test 2: No TagID", - args: args{ - ctx: ctx, - tagID: "", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: Invalid TagID", - args: args{ - ctx: ctx, - tagID: "adads", - }, - want: []models.TagAlias{}, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagAliasByTag(tt.args.ctx, tt.args.tagID) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagAliasByTag() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagAliasByTag() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_DeleteTagAlias(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagAliases := []models.AnthroveTagAliasName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagAliasName := range validTagAliases { - err = postgres.CreateTagAlias(ctx, gormDB, tagAliasName, validTagID) - } - - // Test - type args struct { - ctx context.Context - tagAliasName models.AnthroveTagAliasName - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveTagAliasName", - args: args{ - ctx: ctx, - tagAliasName: validTagAliases[0], - }, - wantErr: false, - }, - { - name: "Test 2: Invalid AnthroveTagAliasName", - args: args{ - ctx: ctx, - tagAliasName: "asdad", - }, - wantErr: false, - }, - { - name: "Test 3: No AnthroveTagAliasName", - args: args{ - ctx: ctx, - tagAliasName: "", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.DeleteTagAlias(tt.args.ctx, tt.args.tagAliasName); (err != nil) != tt.wantErr { - t.Errorf("DeleteTagAlias() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -//-------------------------- - -func Test_postgresqlConnection_CreateTagGroup(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validTagGroupName01 := models.AnthroveTagGroupName("httyd") - validTagGroupName02 := models.AnthroveTagGroupName("dragon") - - validTagID := models.AnthroveTagID("toothless") - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - tagGroupName models.AnthroveTagGroupName - tagID models.AnthroveTagID - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - tagGroupName: validTagGroupName01, - tagID: validTagID, - }, - wantErr: false, - }, - { - name: "Test 2: No TagGroupName", - args: args{ - ctx: ctx, - tagGroupName: "", - tagID: validTagID, - }, - wantErr: true, - }, - { - name: "Test 4: No tagID", - args: args{ - ctx: ctx, - tagGroupName: validTagGroupName01, - tagID: "", - }, - wantErr: true, - }, - { - name: "Test 5: Duplicate tagID", - args: args{ - ctx: ctx, - tagGroupName: validTagGroupName01, - tagID: validTagID, - }, - wantErr: true, - }, - { - name: "Test 6: Invalide tagID", - args: args{ - ctx: ctx, - tagGroupName: validTagGroupName02, - tagID: "aaa", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateTagGroup(tt.args.ctx, tt.args.tagGroupName, tt.args.tagID); (err != nil) != tt.wantErr { - t.Errorf("CreateTagGroup() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreateTagGroupInBatch(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - tags := []models.Tag{ - { - Name: "JayTheFerret", - Type: models.Artist, - }, - { - Name: "SoXX", - Type: models.Character, - }, - { - Name: "Dragon", - Type: models.Species, - }, - { - Name: "Fennec", - Type: models.Species, - }, - } - err = postgres.CreateTagInBatchAndUpdate(ctx, gormDB, tags, len(tags)) - if err != nil { - t.Fatal(err) - } - - tagGroup := []models.TagGroup{ - { - Name: "test1", - TagID: tags[0].Name, - }, - { - Name: "test2", - TagID: tags[1].Name, - }, - { - Name: "test3", - TagID: tags[2].Name, - }, - { - Name: "test4", - TagID: tags[3].Name, - }, - } - emptyTagGroup := []models.TagGroup{} - - // Test - type args struct { - ctx context.Context - tagGroups []models.TagGroup - batchSize int - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Tags", - args: args{ - ctx: ctx, - tagGroups: tagGroup, - batchSize: 10, - }, - wantErr: false, - }, - { - name: "Test 2: Empty Tags", - args: args{ - ctx: ctx, - tagGroups: emptyTagGroup, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 3: Nil Tags", - args: args{ - ctx: ctx, - tagGroups: nil, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 4: No batchSize", - args: args{ - ctx: ctx, - tagGroups: tagGroup, - batchSize: 0, - }, - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateTagGroupInBatch(tt.args.ctx, tt.args.tagGroups, tt.args.batchSize); (err != nil) != tt.wantErr { - t.Errorf("CreateTagGroupInBatch() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTagGroup(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagGroupes := []models.AnthroveTagGroupName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - expectedResult := []models.TagGroup{ - { - Name: string(validTagGroupes[0]), - TagID: string(validTagID), - }, - { - Name: string(validTagGroupes[1]), - TagID: string(validTagID), - }, - { - Name: string(validTagGroupes[2]), - TagID: string(validTagID), - }, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagGroupName := range validTagGroupes { - err = postgres.CreateTagGroup(ctx, gormDB, tagGroupName, validTagID) - } - - // Test - type args struct { - ctx context.Context - } - tests := []struct { - name string - args args - want []models.TagGroup - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ctx: ctx}, - want: expectedResult, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagGroup(tt.args.ctx) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagGroup() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagGroup() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTagGroupByTag(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagGroupes := []models.AnthroveTagGroupName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - expectedResult := []models.TagGroup{ - { - Name: string(validTagGroupes[0]), - TagID: string(validTagID), - }, - { - Name: string(validTagGroupes[1]), - TagID: string(validTagID), - }, - { - Name: string(validTagGroupes[2]), - TagID: string(validTagID), - }, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagGroupName := range validTagGroupes { - err = postgres.CreateTagGroup(ctx, gormDB, tagGroupName, validTagID) - } - - // Test - type args struct { - ctx context.Context - tagID models.AnthroveTagID - } - tests := []struct { - name string - args args - want []models.TagGroup - wantErr bool - }{ - { - name: "Test 1: Valid TagID", - args: args{ - ctx: ctx, - tagID: validTagID, - }, - want: expectedResult, - wantErr: false, - }, - { - name: "Test 2: No TagID", - args: args{ - ctx: ctx, - tagID: "", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: Invalid TagID", - args: args{ - ctx: ctx, - tagID: "adads", - }, - want: []models.TagGroup{}, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagGroupByTag(tt.args.ctx, tt.args.tagID) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagGroupByTag() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagGroupByTag() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_DeleteTagGroup(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - validTagGroupes := []models.AnthroveTagGroupName{"httyd", "dragon", "scaly"} - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - for _, tagGroupName := range validTagGroupes { - err = postgres.CreateTagGroup(ctx, gormDB, tagGroupName, validTagID) - } - - // Test - type args struct { - ctx context.Context - tagGroupName models.AnthroveTagGroupName - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid AnthroveTagGroupName", - args: args{ - ctx: ctx, - tagGroupName: validTagGroupes[0], - }, - wantErr: false, - }, - { - name: "Test 2: Invalid AnthroveTagGroupName", - args: args{ - ctx: ctx, - tagGroupName: "asdad", - }, - wantErr: false, - }, - { - name: "Test 3: No AnthroveTagGroupName", - args: args{ - ctx: ctx, - tagGroupName: "", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.DeleteTagGroup(tt.args.ctx, tt.args.tagGroupName); (err != nil) != tt.wantErr { - t.Errorf("DeleteTagAlias() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -//-------------------------- - -func Test_postgresqlConnection_UpdateUserSourceScrapeTimeInterval(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - invalidUserID := models.AnthroveUserID("XXX") - - validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: validSourceID, - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.icon", - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, "e66e6e6e6", "euser") - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - sourceID models.AnthroveSourceID - scrapeTime models.AnthroveScrapeTimeInterval - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: validSourceID, - scrapeTime: 10, - }, - wantErr: false, - }, - { - name: "Test 2: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: invalidUserID, - sourceID: validSourceID, - scrapeTime: 10, - }, - wantErr: true, - }, - { - name: "Test 3: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: validSourceID, - scrapeTime: 10, - }, - wantErr: true, - }, - { - name: "Test 4: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "111", - scrapeTime: 10, - }, - wantErr: true, - }, - { - name: "Test 5: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "", - scrapeTime: 10, - }, - wantErr: true, - }, - { - name: "Test 5: scrapeTime is empty", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: validSourceID, - scrapeTime: 0, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.UpdateUserSourceScrapeTimeInterval(tt.args.ctx, tt.args.anthroveUserID, tt.args.sourceID, tt.args.scrapeTime); (err != nil) != tt.wantErr { - t.Errorf("UpdateUserSourceScrapeTimeInterval() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_UpdateUserSourceLastScrapeTime(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - invalidUserID := models.AnthroveUserID("XXX") - - validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - validScrapeTime := models.AnthroveUserLastScrapeTime(time.Now()) - inValidScrapeTime := models.AnthroveUserLastScrapeTime{} - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: validSourceID, - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.icon", - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, "e66e6e6e6", "euser") - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - sourceID models.AnthroveSourceID - lastScrapeTime models.AnthroveUserLastScrapeTime - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: validSourceID, - lastScrapeTime: validScrapeTime, - }, - wantErr: false, - }, - { - name: "Test 2: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: invalidUserID, - sourceID: validSourceID, - lastScrapeTime: validScrapeTime, - }, - wantErr: true, - }, - { - name: "Test 3: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: validSourceID, - lastScrapeTime: validScrapeTime, - }, - wantErr: true, - }, - { - name: "Test 4: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "111", - lastScrapeTime: validScrapeTime, - }, - wantErr: true, - }, - { - name: "Test 5: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "", - lastScrapeTime: validScrapeTime, - }, - wantErr: true, - }, - { - name: "Test 5: scrapeTime is empty", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: validSourceID, - lastScrapeTime: inValidScrapeTime, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.UpdateUserSourceLastScrapeTime(tt.args.ctx, tt.args.anthroveUserID, tt.args.sourceID, tt.args.lastScrapeTime); (err != nil) != tt.wantErr { - t.Errorf("UpdateUserSourceLastScrapeTime() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_UpdateUserSourceValidation(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) - invalidUserID := models.AnthroveUserID("XXX") - - validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) - - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: validSourceID, - }, - DisplayName: "e621", - Domain: "e621.net", - Icon: "https://e621.icon", - } - - err = postgres.CreateSource(ctx, gormDB, source) - if err != nil { - t.Fatal(err) - } - - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, "e66e6e6e6", "euser") - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - anthroveUserID models.AnthroveUserID - sourceID models.AnthroveSourceID - valid bool - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: validSourceID, - valid: true, - }, - wantErr: false, - }, - { - name: "Test 2: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: invalidUserID, - sourceID: validSourceID, - valid: true, - }, - wantErr: true, - }, - { - name: "Test 3: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: "", - sourceID: validSourceID, - valid: true, - }, - wantErr: true, - }, - { - name: "Test 4: anthroveUserID to short", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "111", - valid: true, - }, - wantErr: true, - }, - { - name: "Test 5: anthroveUserID is empty", - args: args{ - ctx: ctx, - anthroveUserID: validUserID, - sourceID: "", - valid: true, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.UpdateUserSourceValidation(tt.args.ctx, tt.args.anthroveUserID, tt.args.sourceID, tt.args.valid); (err != nil) != tt.wantErr { - t.Errorf("UpdateUserSourceValidation() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -//-------------------------- - -func Test_postgresqlConnection_DeleteTag(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - validTagID := models.AnthroveTagID("toothless") - - validTag := &models.Tag{ - Name: string(validTagID), - Type: models.Character, - } - - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(validTag.Name), validTag.Type) - if err != nil { - t.Fatal(err) - } - - // Test - type args struct { - ctx context.Context - tagName models.AnthroveTagName - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid TagName", - args: args{ - ctx: ctx, - tagName: models.AnthroveTagName(validTagID), - }, - wantErr: false, - }, - { - name: "Test 2: Invalid TagName", - args: args{ - ctx: ctx, - tagName: models.AnthroveTagName("aaa"), - }, - wantErr: false, - }, - { - name: "Test 3: No TagName", - args: args{ - ctx: ctx, - tagName: "", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.DeleteTag(tt.args.ctx, tt.args.tagName); (err != nil) != tt.wantErr { - t.Errorf("DeleteTag() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_GetAllTagsByTagType(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - - validTags := []models.Tag{ - { - Name: "JayTheFerret", - Type: models.Character, - }, - { - Name: "SoXX", - Type: models.Character, - }, - { - Name: "Alphyron", - Type: models.Character, - }, - { - Name: "Dragon", - Type: models.Species, - }, - } - - expectetResult := []models.Tag{ - { - Name: "JayTheFerret", - Type: models.Character, - }, - { - Name: "SoXX", - Type: models.Character, - }, - { - Name: "Alphyron", - Type: models.Character, - }, - } - - for _, tag := range validTags { - err = postgres.CreateTag(ctx, gormDB, models.AnthroveTagName(tag.Name), tag.Type) - if err != nil { - t.Fatal(err) - } - } - - // Test - type args struct { - ctx context.Context - tagType models.TagType - } - tests := []struct { - name string - args args - want []models.Tag - wantErr bool - }{ - { - name: "Test 1: Get Data", - args: args{ - ctx: ctx, - tagType: models.Character, - }, - want: expectetResult, - wantErr: false, - }, - { - name: "Test 2: invalid Tag Type", - args: args{ - ctx: ctx, - tagType: "aa", - }, - want: nil, - wantErr: true, - }, - { - name: "Test 3: No Tag Type", - args: args{ - ctx: ctx, - tagType: "", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.GetAllTagsByTagType(tt.args.ctx, tt.args.tagType) - if (err != nil) != tt.wantErr { - t.Errorf("GetAllTagsByTagType() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GetAllTagsByTagType() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_postgresqlConnection_CreateTagInBatchAndUpdate(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Test - tags := []models.Tag{ - { - Name: "JayTheFerret", - Type: models.Artist, - }, - { - Name: "SoXX", - Type: models.Character, - }, - { - Name: "Dragon", - Type: models.Species, - }, - { - Name: "Fennec", - Type: models.Species, - }, - } - emptyTags := []models.Tag{} - - // Test - type args struct { - ctx context.Context - tags []models.Tag - batchSize int - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Tags", - args: args{ - ctx: ctx, - tags: tags, - batchSize: 10, - }, - wantErr: false, - }, - { - name: "Test 2: Empty Tags", - args: args{ - ctx: ctx, - tags: emptyTags, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 3: Nil Tags", - args: args{ - ctx: ctx, - tags: nil, - batchSize: 10, - }, - wantErr: true, - }, - { - name: "Test 4: No batchSize", - args: args{ - ctx: ctx, - tags: nil, - batchSize: 0, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreateTagInBatchAndUpdate(tt.args.ctx, tt.args.tags, tt.args.batchSize); (err != nil) != tt.wantErr { - t.Errorf("CreateTagInBatchAndUpdate() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_postgresqlConnection_CreatePostInBatch(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Setup Tests - - validPosts := []models.Post{ - { - Rating: models.SFW, - }, - { - Rating: models.NSFW, - }, - { - Rating: models.Questionable, - }, - } - - emptyPost := []models.Post{} - - // Test - type args struct { - ctx context.Context - anthrovePost []models.Post - batchSize int - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Test 1: Valid Data", - args: args{ - ctx: ctx, - anthrovePost: validPosts, - batchSize: len(validPosts), - }, - wantErr: false, - }, - { - name: "Test 2: Emtpy Data", - args: args{ - ctx: ctx, - anthrovePost: emptyPost, - batchSize: 0, - }, - wantErr: true, - }, - { - name: "Test 3: Nil Data", - args: args{ - ctx: ctx, - anthrovePost: nil, - batchSize: 0, - }, - wantErr: true, - }, - { - name: "Test 4: batchSize 0", - args: args{ - ctx: ctx, - anthrovePost: validPosts, - batchSize: 0, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - if err := p.CreatePostInBatch(tt.args.ctx, tt.args.anthrovePost, tt.args.batchSize); (err != nil) != tt.wantErr { - t.Errorf("CreatePostInBatch() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func checkFavoritePosts(got *models.FavoriteList, want *models.FavoriteList) bool { - if got == nil && want == nil { - return true - } else if got == nil || want == nil { - return false - } - - for i, post := range got.Posts { - if post.ID == want.Posts[i].ID { - } else { - return false - } - } - - return true -} - -func Test_postgresqlConnection_ExecuteRawStatement(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Test - type args struct { - ctx context.Context - query string - args []any - } - tests := []struct { - name string - args args - want *sql.Rows - wantErr bool - }{ - { - name: "Test 01: Empty Query", - args: args{ - ctx: ctx, - query: "", - args: nil, - }, - want: nil, - wantErr: true, - }, - { - name: "Test 02: Nil Query", - args: args{ - ctx: ctx, - query: "aasd", - args: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - err := p.ExecuteRawStatement(tt.args.ctx, tt.args.query, tt.args.args...) - if (err != nil) != tt.wantErr { - t.Errorf("ExecuteRawStatement() error = %v, wantErr %v", err, tt.wantErr) - return - } - }) - } -} - -func Test_postgresqlConnection_QueryRawStatement(t *testing.T) { - // Setup trow away container - ctx := context.Background() - container, gormDB, err := test.StartPostgresContainer(ctx) - if err != nil { - t.Fatalf("Could not start PostgreSQL container: %v", err) - } - defer container.Terminate(ctx) - - // Test - type args struct { - ctx context.Context - query string - args []any - } - tests := []struct { - name string - args args - want *sql.Rows - wantErr bool - }{ - { - name: "Test 01: Empty Query", - args: args{ - ctx: ctx, - query: "", - args: nil, - }, - want: nil, - wantErr: true, - }, - { - name: "Test 02: Nil Query", - args: args{ - ctx: ctx, - query: "aasd", - args: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := &postgresqlConnection{ - db: gormDB, - debug: true, - } - got, err := p.QueryRawStatement(tt.args.ctx, tt.args.query, tt.args.args...) - if (err != nil) != tt.wantErr { - t.Errorf("QueryRawStatement() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("QueryRawStatement() got = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/pkg/database/tag.go b/pkg/database/tag.go deleted file mode 100644 index c7fe822..0000000 --- a/pkg/database/tag.go +++ /dev/null @@ -1,20 +0,0 @@ -package database - -import ( - "context" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type Tag interface { - CreateTag(ctx context.Context, tagName models.AnthroveTagName, tagType models.TagType) error - - CreateTagInBatchAndUpdate(ctx context.Context, tags []models.Tag, batchSize int) error - - // GetAllTags retrieves all tags. - GetAllTags(ctx context.Context) ([]models.Tag, error) - - GetAllTagsByTagType(ctx context.Context, tagType models.TagType) ([]models.Tag, error) - - DeleteTag(ctx context.Context, tagName models.AnthroveTagName) error -} diff --git a/pkg/database/tagalias.go b/pkg/database/tagalias.go deleted file mode 100644 index 0f26efb..0000000 --- a/pkg/database/tagalias.go +++ /dev/null @@ -1,19 +0,0 @@ -package database - -import ( - "context" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type TagAlias interface { - CreateTagAlias(ctx context.Context, tagAliasName models.AnthroveTagAliasName, tagID models.AnthroveTagID) error - - CreateTagAliasInBatch(ctx context.Context, tagsAliases []models.TagAlias, batchSize int) error - - GetAllTagAlias(ctx context.Context) ([]models.TagAlias, error) - - GetAllTagAliasByTag(ctx context.Context, tagID models.AnthroveTagID) ([]models.TagAlias, error) - - DeleteTagAlias(ctx context.Context, tagAliasName models.AnthroveTagAliasName) error -} diff --git a/pkg/database/taggroup.go b/pkg/database/taggroup.go deleted file mode 100644 index e293c68..0000000 --- a/pkg/database/taggroup.go +++ /dev/null @@ -1,19 +0,0 @@ -package database - -import ( - "context" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type TagGroup interface { - CreateTagGroup(ctx context.Context, tagGroupName models.AnthroveTagGroupName, tagID models.AnthroveTagID) error - - CreateTagGroupInBatch(ctx context.Context, tagsGroups []models.TagGroup, batchSize int) error - - GetAllTagGroup(ctx context.Context) ([]models.TagGroup, error) - - GetAllTagGroupByTag(ctx context.Context, tagID models.AnthroveTagID) ([]models.TagGroup, error) - - DeleteTagGroup(ctx context.Context, tagGroupName models.AnthroveTagGroupName) error -} diff --git a/pkg/database/user.go b/pkg/database/user.go deleted file mode 100644 index ecf5900..0000000 --- a/pkg/database/user.go +++ /dev/null @@ -1,42 +0,0 @@ -package database - -import ( - "context" - - "git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models" -) - -type User interface { - - // CreateUserWithRelationToSource adds a user with a relation to a source. - CreateUserWithRelationToSource(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, accountId string, accountUsername string) error - - // CreateReferenceBetweenUserAndPost links a user with a post. - CreateReferenceBetweenUserAndPost(ctx context.Context, anthroveUserID models.AnthroveUserID, anthrovePostID models.AnthrovePostID) error - - UpdateUserSourceScrapeTimeInterval(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, scrapeTime models.AnthroveScrapeTimeInterval) error - - UpdateUserSourceLastScrapeTime(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, lastScrapeTime models.AnthroveUserLastScrapeTime) error - - UpdateUserSourceValidation(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, valid bool) error - - GetAllUsers(ctx context.Context) ([]models.User, error) - - // GetUserFavoritesCount retrieves the count of a user's favorites. - GetUserFavoritesCount(ctx context.Context, anthroveUserID models.AnthroveUserID) (int64, error) - - // GetAllUserSources retrieves the source links of a user. - GetAllUserSources(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]models.UserSource, error) - - // GetUserSourceBySourceID retrieves a specified source link of a user. - GetUserSourceBySourceID(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID) (*models.UserSource, error) - - // GetAllUserFavoritesWithPagination retrieves a user's favorite posts with pagination. - GetAllUserFavoritesWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error) - - // GetAllTagsFromUser retrieves a user's tags through their favorite posts. - GetAllTagsFromUser(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]models.TagsWithFrequency, error) - - // CheckIfUserHasPostAsFavorite checks if a user-post link exists. - CheckIfUserHasPostAsFavorite(ctx context.Context, anthroveUserID models.AnthroveUserID, sourcePostID models.AnthrovePostID) (bool, error) -}