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 }