package magnet import ( "encoding/hex" "testing" ) func TestParseMagnetLink(t *testing.T) { t.Parallel() tests := []struct { name string uri string wantName string wantHash string wantTrack int wantErr bool }{ { name: "valid magnet with tracker", uri: "magnet:?xt=urn:btih:3132333435363738393031323334353637383930&dn=ubuntu.iso&tr=http%3A%2F%2Ftracker.com%2Fannounce", wantName: "ubuntu.iso", wantHash: "3132333435363738393031323334353637383930", wantTrack: 1, wantErr: false, }, { name: "valid magnet base32", uri: "magnet:?xt=urn:btih:GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&dn=test", wantName: "test", wantHash: "3132333435363738393031323334353637383930", wantTrack: 0, wantErr: false, }, { name: "invalid prefix", uri: "http://example.com", wantErr: true, }, { name: "missing xt", uri: "magnet:?dn=ubuntu.iso", wantErr: true, }, { name: "invalid hash length", uri: "magnet:?xt=urn:btih:1234&dn=ubuntu", wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() ml, err := Parse(tt.uri) if (err != nil) != tt.wantErr { t.Fatalf("Parse() error = %v, wantErr %v", err, tt.wantErr) } if err == nil { if ml.Name != tt.wantName { t.Errorf("Parse() got name = %v, want %v", ml.Name, tt.wantName) } if gotHash := hex.EncodeToString(ml.InfoHash[:]); gotHash != tt.wantHash { t.Errorf("Parse() got hash = %v, want %v", gotHash, tt.wantHash) } if len(ml.Trackers) != tt.wantTrack { t.Errorf("Parse() got %v trackers, want %v", len(ml.Trackers), tt.wantTrack) } } }) } }