github.com/Ptt-official-app/go-bbs@v0.12.0/bbs_test.go (about)

     1  package bbs
     2  
     3  import (
     4  	"encoding/hex"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func TestGetBoardArticleCommentRecords(t *testing.T) {
    11  
    12  	anyBoardID := ""
    13  	anyArticleRecord := &MockArticleRecord{}
    14  	articleContent := `
    15  a740 aacc 3a20 5359 534f 5020 28af ab29
    16  20ac ddaa 4f3a 2074 6573 740a bcd0 c344
    17  3a20 5bb0 ddc3 445d 2054 6869 7320 506f
    18  7374 2077 696c 6c20 6265 2069 6e20 6d61
    19  6e0a aec9 b6a1 3a20 5361 7420 4a61 6e20
    20  2039 2031 393a 3032 3a31 3220 3230 3231
    21  0a0a 0a54 6573 740a 0a2d 2d0a a1b0 20b5
    22  6fab 48af b83a 20b7 73a7 e5bd f0bd f028
    23  7074 7432 2e63 6329 2c20 a8d3 a6db 3a20
    24  312e 3136 342e 3131 312e 3135 360a a1b0
    25  20a4 e5b3 b9ba f4a7 7d3a 2068 7474 703a
    26  2f2f 7777 772e 7074 742e 6363 2f62 6273
    27  2f74 6573 742f 4d2e 3136 3130 3231 3839
    28  3334 2e41 2e46 4130 2e68 746d 6c0a 1b5b
    29  313b 3331 6da1 f720 1b5b 3333 6d53 5953
    30  4f50 1b5b 6d1b 5b33 336d 3a50 7573 6820
    31  2020 2020 2020 2020 2020 2020 2020 2020
    32  2020 2020 2020 2020 2020 2020 2020 2020
    33  2020 2020 2020 2020 2020 2020 2020 2020
    34  2020 1b5b 6db1 c020 3031 2f30 3920 3139
    35  3a30 320a 1b5b 313b 3331 6da1 f720 1b5b
    36  3333 6d53 5953 4f50 1b5b 6d1b 5b33 336d
    37  3a74 6573 7420 2020 2020 2020 2020 2020
    38  2020 2020 2020 2020 2020 2020 2020 2020
    39  2020 2020 2020 2020 2020 2020 2020 2020
    40  2020 2020 2020 2020 1b5b 6db1 c020 3031
    41  2f31 3720 3131 3a33 360a a1b0 201b 5b31
    42  3b33 326d 7069 6368 7532 1b5b 303b 3332
    43  6d3a c2e0 bffd a6dc acdd aa4f 2053 5953
    44  4f50 1b5b 6d20 2020 2020 2020 2020 2020
    45  2020 2020 2020 2020 2020 2020 2020 2020
    46  2020 2020 2031 3131 2e32 3438 2e34 372e
    47  3136 3420 3031 2f32 370a`
    48  
    49  	returnPerfectBoardArticleFilePath := func() (string, error) {
    50  		return anyBoardID, nil
    51  	}
    52  	returnPerfectReadBoardArticleFile := func() ([]byte, error) {
    53  		return hexToByte(articleContent), nil
    54  	}
    55  
    56  	type fields struct {
    57  		connector Connector
    58  	}
    59  	type args struct {
    60  		boardID       string
    61  		articleRecord ArticleRecord
    62  	}
    63  	type expected struct {
    64  		recordCount int
    65  		hasErr      bool
    66  	}
    67  	tests := []struct {
    68  		name     string
    69  		fields   fields
    70  		args     args
    71  		expected expected
    72  	}{
    73  		{
    74  			name: "parse an article contains two user comments",
    75  			fields: fields{
    76  				connector: &fakeConnector{
    77  					fakeGetBoardArticleFilePath: returnPerfectBoardArticleFilePath,
    78  					fakeReadBoardArticleFile:    returnPerfectReadBoardArticleFile,
    79  				},
    80  			},
    81  			args:     args{anyBoardID, anyArticleRecord},
    82  			expected: expected{2, false},
    83  		},
    84  	}
    85  
    86  	for _, tt := range tests {
    87  		t.Run(tt.name, func(t *testing.T) {
    88  			db := &DB{connector: tt.fields.connector}
    89  
    90  			got, err := db.GetBoardArticleCommentRecords(tt.args.boardID, tt.args.articleRecord)
    91  
    92  			if len(got) != tt.expected.recordCount {
    93  				t.Errorf("record count = %v, expected %v\n", len(got), tt.expected.recordCount)
    94  			}
    95  
    96  			if (err != nil) != tt.expected.hasErr {
    97  				t.Errorf("err = %v, should be nil\n", err)
    98  			}
    99  		})
   100  	}
   101  
   102  }
   103  
   104  type fakeConnector struct {
   105  	fakeOpen                        func() error
   106  	fakeGetUserRecordsPath          func() (string, error)
   107  	fakeReadUserRecordsFile         func() ([]UserRecord, error)
   108  	fakeGetUserFavoriteRecordsPath  func() (string, error)
   109  	fakeReadUserFavoriteRecordsFile func() ([]FavoriteRecord, error)
   110  	fakeGetBoardRecordsPath         func() (string, error)
   111  	fakeReadBoardRecordsFile        func() ([]BoardRecord, error)
   112  	fakeGetBoardArticleRecordsPath  func() (string, error)
   113  	fakeGetBoardTreasureRecordsPath func() (string, error)
   114  	fakeReadArticleRecordsFile      func() ([]ArticleRecord, error)
   115  	fakeGetBoardArticleFilePath     func() (string, error)
   116  	fakeGetBoardTreasureFilePath    func() (string, error)
   117  	fakeReadBoardArticleFile        func() ([]byte, error)
   118  }
   119  
   120  var _ Connector = &fakeConnector{}
   121  
   122  func (c *fakeConnector) Open(dataSourceName string) error {
   123  	return c.fakeOpen()
   124  }
   125  
   126  func (c *fakeConnector) GetUserRecordsPath() (string, error) {
   127  	return c.fakeGetUserRecordsPath()
   128  }
   129  
   130  func (c *fakeConnector) ReadUserRecordsFile(name string) ([]UserRecord, error) {
   131  	return c.fakeReadUserRecordsFile()
   132  }
   133  
   134  func (c *fakeConnector) GetUserFavoriteRecordsPath(userID string) (string, error) {
   135  	return c.fakeGetUserFavoriteRecordsPath()
   136  }
   137  
   138  func (c *fakeConnector) ReadUserFavoriteRecordsFile(name string) ([]FavoriteRecord, error) {
   139  	return c.fakeReadUserFavoriteRecordsFile()
   140  }
   141  
   142  func (c *fakeConnector) GetBoardRecordsPath() (string, error) {
   143  	return c.fakeGetBoardRecordsPath()
   144  }
   145  
   146  func (c *fakeConnector) ReadBoardRecordsFile(name string) ([]BoardRecord, error) {
   147  	return c.fakeReadBoardRecordsFile()
   148  }
   149  
   150  func (c *fakeConnector) GetBoardArticleRecordsPath(boardID string) (string, error) {
   151  	return c.fakeGetBoardArticleRecordsPath()
   152  }
   153  
   154  func (c *fakeConnector) GetBoardTreasureRecordsPath(boardID string, treasureID []string) (string, error) {
   155  	return c.fakeGetBoardTreasureRecordsPath()
   156  }
   157  
   158  func (c *fakeConnector) ReadArticleRecordsFile(name string) ([]ArticleRecord, error) {
   159  	return c.fakeReadArticleRecordsFile()
   160  }
   161  
   162  func (c *fakeConnector) GetBoardArticleFilePath(boardID string, filename string) (string, error) {
   163  	return c.fakeGetBoardArticleFilePath()
   164  }
   165  
   166  func (c *fakeConnector) GetBoardTreasureFilePath(boardID string, treasureID []string, name string) (string, error) {
   167  	return c.fakeGetBoardTreasureFilePath()
   168  }
   169  
   170  func (c *fakeConnector) ReadBoardArticleFile(name string) ([]byte, error) {
   171  	return c.fakeReadBoardArticleFile()
   172  }
   173  
   174  func hexToByte(input string) []byte {
   175  	s := strings.ReplaceAll(input, " ", "")
   176  	s = strings.ReplaceAll(s, "\t", "")
   177  	s = strings.ReplaceAll(s, "\n", "")
   178  	b, _ := hex.DecodeString(s)
   179  	return b
   180  }
   181  
   182  type MockArticleRecord struct {
   183  	filename  string
   184  	modified  time.Time
   185  	recommend int8
   186  	owner     string
   187  	date      string
   188  	title     string
   189  	money     int
   190  }
   191  
   192  func (f *MockArticleRecord) Filename() string                  { return f.filename }
   193  func (f *MockArticleRecord) Modified() time.Time               { return f.modified }
   194  func (f *MockArticleRecord) SetModified(newModified time.Time) { f.modified = newModified }
   195  func (f *MockArticleRecord) Recommend() int                    { return int(f.recommend) }
   196  func (f *MockArticleRecord) Owner() string                     { return f.owner }
   197  func (f *MockArticleRecord) Date() string                      { return f.date }
   198  func (f *MockArticleRecord) Title() string                     { return f.title }
   199  func (f *MockArticleRecord) Money() int                        { return f.money }