// Copyright 2026 Mihna123 Software // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. package listing import ( "errors" "log/slog" "os" "slices" "testing" ) func TestMain(m *testing.M) { slog.SetDefault(slog.New(slog.DiscardHandler)) os.Exit(m.Run()) } func TestGetAll(t *testing.T) { mock := NewRepositoryMock() s := New(mock) listings, err := s.GetAll() if err != nil { t.Error(err.Error()) } if len(listings) != 3 { t.Errorf("Listings lengths don't match. Have %d, want 3", len(listings)) } } func TestGetAllWithError(t *testing.T) { mock := &RepositoryMock{err: errors.New("db exploded")} s := New(mock) listings, err := s.GetAll() if err == nil { t.Error("No error returned from faulty GetAll call") } if listings != nil { t.Error("Listings not nil when returned from faulty GetAll call") } } func TestGetByCategory(t *testing.T) { mock := NewRepositoryMock() s := New(mock) listings, err := s.GetByCategory("audi") if err != nil { t.Error(err.Error()) } if len(listings) != 1 { t.Errorf("Listings by category have wrong length. Have %d, want %d", len(listings), 1) } if !slices.Contains(listings[0].category, "audi") { t.Errorf("Returned listing has wrong category. Have %s, want audi", listings[0].category) } } func TestGetByCategoryNoMatches(t *testing.T) { mock := &RepositoryMock{} s := New(mock) listings, err := s.GetByCategory("nonexistantcategory") if err != nil { t.Error(err.Error()) } if listings != nil { t.Error("Listings should be nil if no category matches") } } func TestGetByCategoryWithError(t *testing.T) { mock := &RepositoryMock{err: errors.New("datacenter hit by asteroid")} s := New(mock) listings, err := s.GetByCategory("mercedes") if err == nil { t.Error("Error nil when GetByCategory failed") } if listings != nil { t.Error("Listings not nil when GetByCategory failed") } }