| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338 |
- package handler
- import (
- "testing"
- "time"
- "github.com/mk6i/retro-aim-server/oscar"
- "github.com/mk6i/retro-aim-server/state"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/mock"
- )
- func TestFeedbagService_QueryHandler(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // userSession is the session of the user adding to feedbag
- userSession *state.Session
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC oscar.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput oscar.SNACMessage
- }{
- {
- name: "retrieve empty feedbag",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagParams: feedbagParams{
- {
- screenName: "user_screen_name",
- results: []oscar.FeedbagItem{},
- },
- },
- feedbagLastModifiedParams: feedbagLastModifiedParams{},
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagReply,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x06_FeedbagReply{
- Items: []oscar.FeedbagItem{},
- },
- },
- },
- {
- name: "retrieve feedbag with items",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagParams: feedbagParams{
- {
- screenName: "user_screen_name",
- results: []oscar.FeedbagItem{
- {
- Name: "buddy_1",
- },
- {
- Name: "buddy_2",
- },
- },
- },
- },
- feedbagLastModifiedParams: feedbagLastModifiedParams{
- {
- screenName: "user_screen_name",
- result: time.UnixMilli(1696472198082),
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagReply,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x06_FeedbagReply{
- Version: 0,
- Items: []oscar.FeedbagItem{
- {
- Name: "buddy_1",
- },
- {
- Name: "buddy_2",
- },
- },
- LastUpdate: uint32(time.UnixMilli(1696472198082).Unix()),
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- feedbagManager := newMockFeedbagManager(t)
- for _, params := range tc.mockParams.feedbagParams {
- feedbagManager.EXPECT().
- Feedbag(params.screenName).
- Return(params.results, nil)
- }
- for _, params := range tc.mockParams.feedbagLastModifiedParams {
- feedbagManager.EXPECT().
- FeedbagLastModified(params.screenName).
- Return(params.result, nil)
- }
- svc := FeedbagService{
- feedbagManager: feedbagManager,
- }
- outputSNAC, err := svc.QueryHandler(nil, tc.userSession, tc.inputSNAC.Frame)
- assert.NoError(t, err)
- assert.Equal(t, tc.expectOutput, outputSNAC)
- })
- }
- }
- func TestFeedbagService_QueryIfModifiedHandler(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // userSession is the session of the user adding to feedbag
- userSession *state.Session
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC oscar.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput oscar.SNACMessage
- }{
- {
- name: "retrieve empty feedbag",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x05_FeedbagQueryIfModified{
- LastUpdate: uint32(time.UnixMilli(100000).Unix()),
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagParams: feedbagParams{
- {
- screenName: "user_screen_name",
- results: []oscar.FeedbagItem{},
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagReply,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x06_FeedbagReply{
- Items: []oscar.FeedbagItem{},
- },
- },
- },
- {
- name: "retrieve feedbag with items",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x05_FeedbagQueryIfModified{
- LastUpdate: uint32(time.UnixMilli(100000).Unix()),
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagParams: feedbagParams{
- {
- screenName: "user_screen_name",
- results: []oscar.FeedbagItem{
- {
- Name: "buddy_1",
- },
- {
- Name: "buddy_2",
- },
- },
- },
- },
- feedbagLastModifiedParams: feedbagLastModifiedParams{
- {
- screenName: "user_screen_name",
- result: time.UnixMilli(200000),
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagReply,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x06_FeedbagReply{
- Version: 0,
- Items: []oscar.FeedbagItem{
- {
- Name: "buddy_1",
- },
- {
- Name: "buddy_2",
- },
- },
- LastUpdate: uint32(time.UnixMilli(200000).Unix()),
- },
- },
- },
- {
- name: "retrieve not-modified response",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x05_FeedbagQueryIfModified{
- LastUpdate: uint32(time.UnixMilli(200000).Unix()),
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagParams: feedbagParams{
- {
- screenName: "user_screen_name",
- results: []oscar.FeedbagItem{
- {
- Name: "buddy_1",
- },
- {
- Name: "buddy_2",
- },
- },
- },
- },
- feedbagLastModifiedParams: feedbagLastModifiedParams{
- {
- screenName: "user_screen_name",
- result: time.UnixMilli(100000),
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagReplyNotModified,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x05_FeedbagQueryIfModified{
- LastUpdate: uint32(time.UnixMilli(100000).Unix()),
- Count: 2,
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- //
- // initialize dependencies
- //
- feedbagManager := newMockFeedbagManager(t)
- for _, params := range tc.mockParams.feedbagParams {
- feedbagManager.EXPECT().
- Feedbag(params.screenName).
- Return(params.results, nil)
- }
- for _, params := range tc.mockParams.feedbagLastModifiedParams {
- feedbagManager.EXPECT().
- FeedbagLastModified(params.screenName).
- Return(params.result, nil)
- }
- //
- // send input SNAC
- //
- svc := FeedbagService{
- feedbagManager: feedbagManager,
- }
- outputSNAC, err := svc.QueryIfModifiedHandler(nil, tc.userSession, tc.inputSNAC.Frame,
- tc.inputSNAC.Body.(oscar.SNAC_0x13_0x05_FeedbagQueryIfModified))
- assert.NoError(t, err)
- //
- // verify output
- //
- assert.Equal(t, tc.expectOutput, outputSNAC)
- })
- }
- }
- func TestFeedbagService_RightsQueryHandler(t *testing.T) {
- svc := NewFeedbagService(nil, nil)
- outputSNAC := svc.RightsQueryHandler(nil, oscar.SNACFrame{RequestID: 1234})
- expectSNAC := oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagRightsReply,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x03_FeedbagRightsReply{
- TLVRestBlock: oscar.TLVRestBlock{
- TLVList: oscar.TLVList{
- oscar.NewTLV(oscar.FeedbagRightsMaxItemAttrs, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxItemsByClass, []uint16{
- 0x3D,
- 0x3D,
- 0x64,
- 0x64,
- 0x01,
- 0x01,
- 0x32,
- 0x00,
- 0x00,
- 0x03,
- 0x00,
- 0x00,
- 0x00,
- 0x80,
- 0xFF,
- 0x14,
- 0xC8,
- 0x01,
- 0x00,
- 0x01,
- 0x00,
- }),
- oscar.NewTLV(oscar.FeedbagRightsMaxClientItems, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxItemNameLen, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxRecentBuddies, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsInteractionBuddies, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsInteractionHalfLife, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsInteractionMaxScore, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxBuddiesPerGroup, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxMegaBots, uint16(200)),
- oscar.NewTLV(oscar.FeedbagRightsMaxSmartGroups, uint16(100)),
- },
- },
- },
- }
- assert.Equal(t, expectSNAC, outputSNAC)
- }
- func TestFeedbagService_InsertItemHandler(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // userSession is the session of the user adding to feedbag
- userSession *state.Session
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC oscar.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput oscar.SNACMessage
- }{
- {
- name: "user adds online buddies to feedbag, receives buddy arrival notifications",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_2_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_2_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_1_online",
- sess: newTestSession("buddy_1_online", sessOptCannedSignonTime),
- },
- {
- screenName: "buddy_2_online",
- sess: newTestSession("buddy_2_online", sessOptCannedSignonTime),
- },
- },
- sendToScreenNameParams: sendToScreenNameParams{
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_1_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_2_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000, 0x0000},
- },
- },
- },
- {
- name: "user adds offline buddy to feedbag, receives no buddy arrival notification",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_offline",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_offline",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_offline",
- sess: nil,
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user adds invisible buddy to feedbag, receives no buddy arrival notification",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "invisible_buddy_online",
- sess: newTestSession("invisible_buddy_online", sessOptInvisible),
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user blocks online buddy, buddy receives buddy departure notification",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_1",
- sess: newTestSession("buddy_1"),
- },
- },
- sendToScreenNameParams: sendToScreenNameParams{
- {
- screenName: "buddy_1",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyDeparted,
- },
- Body: oscar.SNAC_0x03_0x0C_BuddyDeparted{
- TLVUserInfo: oscar.TLVUserInfo{
- ScreenName: "user_screen_name",
- WarningLevel: 0,
- },
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user blocks offline buddy, no buddy departure notification sent",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_1",
- sess: nil,
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "invisible user blocks online buddy, no buddy departure notification sent",
- userSession: newTestSession("user_screen_name", sessOptInvisible),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1",
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user blocks themselves, receives error",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x08_FeedbagInsertItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "user_screen_name",
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagErr,
- RequestID: 1234,
- },
- Body: oscar.SNACError{
- Code: oscar.ErrorCodeNotSupportedByHost,
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- feedbagManager := newMockFeedbagManager(t)
- for _, params := range tc.mockParams.feedbagManagerParams.feedbagUpsertParams {
- feedbagManager.EXPECT().
- FeedbagUpsert(params.screenName, params.items).
- Return(nil)
- }
- messageRelayer := newMockMessageRelayer(t)
- for _, params := range tc.mockParams.messageRelayerParams.retrieveByScreenNameParams {
- messageRelayer.EXPECT().
- RetrieveByScreenName(params.screenName).
- Return(params.sess)
- }
- for _, params := range tc.mockParams.messageRelayerParams.sendToScreenNameParams {
- messageRelayer.EXPECT().
- RelayToScreenName(mock.Anything, params.screenName, params.message)
- }
- svc := FeedbagService{
- feedbagManager: feedbagManager,
- messageRelayer: messageRelayer,
- }
- output, err := svc.InsertItemHandler(nil, tc.userSession, tc.inputSNAC.Frame,
- tc.inputSNAC.Body.(oscar.SNAC_0x13_0x08_FeedbagInsertItem))
- assert.NoError(t, err)
- assert.Equal(t, output, tc.expectOutput)
- })
- }
- }
- func TestFeedbagService_UpdateItemHandler(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // userSession is the session of the user adding to feedbag
- userSession *state.Session
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC oscar.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput oscar.SNACMessage
- }{
- {
- name: "user updates online buddies in feedbag, receives buddy arrival notifications",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x09_FeedbagUpdateItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_2_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_2_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_1_online",
- sess: newTestSession("buddy_1_online", sessOptCannedSignonTime),
- },
- {
- screenName: "buddy_2_online",
- sess: newTestSession("buddy_2_online", sessOptCannedSignonTime),
- },
- },
- sendToScreenNameParams: sendToScreenNameParams{
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_1_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_2_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000, 0x0000},
- },
- },
- },
- {
- name: "user updates offline buddy in feedbag, receives no buddy arrival notification",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x09_FeedbagUpdateItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_offline",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "buddy_offline",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_offline",
- sess: nil,
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user updates an invisible buddy in feedbag, receives no buddy arrival notification",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x09_FeedbagUpdateItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagUpsertParams: feedbagUpsertParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDPermit,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "invisible_buddy_online",
- sess: newTestSession("invisible_buddy_online", sessOptInvisible),
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- feedbagManager := newMockFeedbagManager(t)
- for _, params := range tc.mockParams.feedbagManagerParams.feedbagUpsertParams {
- feedbagManager.EXPECT().
- FeedbagUpsert(params.screenName, params.items).
- Return(nil)
- }
- messageRelayer := newMockMessageRelayer(t)
- for _, params := range tc.mockParams.messageRelayerParams.retrieveByScreenNameParams {
- messageRelayer.EXPECT().
- RetrieveByScreenName(params.screenName).
- Return(params.sess)
- }
- for _, params := range tc.mockParams.messageRelayerParams.sendToScreenNameParams {
- messageRelayer.EXPECT().
- RelayToScreenName(mock.Anything, params.screenName, params.message)
- }
- svc := FeedbagService{
- feedbagManager: feedbagManager,
- messageRelayer: messageRelayer,
- }
- output, err := svc.UpdateItemHandler(nil, tc.userSession, tc.inputSNAC.Frame,
- tc.inputSNAC.Body.(oscar.SNAC_0x13_0x09_FeedbagUpdateItem))
- assert.NoError(t, err)
- assert.Equal(t, output, tc.expectOutput)
- })
- }
- }
- func TestFeedbagService_DeleteItemHandler(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // userSession is the session of the user adding to feedbag
- userSession *state.Session
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC oscar.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput oscar.SNACMessage
- }{
- {
- name: "user deletes buddy",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0A_FeedbagDeleteItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIdBuddy,
- Name: "buddy_1_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagDeleteParams: feedbagDeleteParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIdBuddy,
- Name: "buddy_1_online",
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user unblocks buddies, user and buddies receive buddy arrival notifications",
- userSession: newTestSession("user_screen_name", sessOptCannedSignonTime),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0A_FeedbagDeleteItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_2_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagDeleteParams: feedbagDeleteParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_1_online",
- },
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_2_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_1_online",
- sess: newTestSession("buddy_1_online", sessOptCannedSignonTime),
- },
- {
- screenName: "buddy_2_online",
- sess: newTestSession("buddy_2_online", sessOptCannedSignonTime),
- },
- },
- sendToScreenNameParams: sendToScreenNameParams{
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_1_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- {
- screenName: "buddy_1_online",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("user_screen_name", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- {
- screenName: "user_screen_name",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("buddy_2_online", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- {
- screenName: "buddy_2_online",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("user_screen_name", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000, 0x0000},
- },
- },
- },
- {
- name: "user unblocks offline buddy, receives no buddy arrival notifications",
- userSession: newTestSession("user_screen_name"),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0A_FeedbagDeleteItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_offline",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagDeleteParams: feedbagDeleteParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "buddy_offline",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "buddy_offline",
- sess: nil,
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- {
- name: "user unblocks invisible buddy, user receives no buddy arrival notification, buddy receives buddy arrival notifications",
- userSession: newTestSession("user_screen_name", sessOptCannedSignonTime),
- inputSNAC: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0A_FeedbagDeleteItem{
- Items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- mockParams: mockParams{
- feedbagManagerParams: feedbagManagerParams{
- feedbagDeleteParams: feedbagDeleteParams{
- {
- screenName: "user_screen_name",
- items: []oscar.FeedbagItem{
- {
- ClassID: oscar.FeedbagClassIDDeny,
- Name: "invisible_buddy_online",
- },
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- retrieveByScreenNameParams: retrieveByScreenNameParams{
- {
- screenName: "invisible_buddy_online",
- sess: newTestSession("invisible_buddy_online", sessOptInvisible),
- },
- },
- sendToScreenNameParams: sendToScreenNameParams{
- {
- screenName: "invisible_buddy_online",
- message: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Buddy,
- SubGroup: oscar.BuddyArrived,
- },
- Body: oscar.SNAC_0x03_0x0B_BuddyArrived{
- TLVUserInfo: newTestSession("user_screen_name", sessOptCannedSignonTime).TLVUserInfo(),
- },
- },
- },
- },
- },
- },
- expectOutput: oscar.SNACMessage{
- Frame: oscar.SNACFrame{
- FoodGroup: oscar.Feedbag,
- SubGroup: oscar.FeedbagStatus,
- RequestID: 1234,
- },
- Body: oscar.SNAC_0x13_0x0E_FeedbagStatus{
- Results: []uint16{0x0000},
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- feedbagManager := newMockFeedbagManager(t)
- for _, params := range tc.mockParams.feedbagManagerParams.feedbagDeleteParams {
- feedbagManager.EXPECT().
- FeedbagDelete(params.screenName, params.items).
- Return(nil)
- }
- messageRelayer := newMockMessageRelayer(t)
- for _, params := range tc.mockParams.messageRelayerParams.retrieveByScreenNameParams {
- messageRelayer.EXPECT().
- RetrieveByScreenName(params.screenName).
- Return(params.sess)
- }
- for _, params := range tc.mockParams.messageRelayerParams.sendToScreenNameParams {
- messageRelayer.EXPECT().
- RelayToScreenName(mock.Anything, params.screenName, params.message)
- }
- svc := FeedbagService{
- feedbagManager: feedbagManager,
- messageRelayer: messageRelayer,
- }
- output, err := svc.DeleteItemHandler(nil, tc.userSession, tc.inputSNAC.Frame,
- tc.inputSNAC.Body.(oscar.SNAC_0x13_0x0A_FeedbagDeleteItem))
- assert.NoError(t, err)
- assert.Equal(t, output, tc.expectOutput)
- })
- }
- }
|