From 47f89e7d226a5b48c75404124d29314b7533d0fe Mon Sep 17 00:00:00 2001 From: Nikita Pozdeev Date: Sun, 10 Aug 2025 17:05:03 +0300 Subject: [PATCH 1/2] first commit --- .DS_Store | Bin 0 -> 6148 bytes main.go | 8 ++++- parcel.go | 79 ++++++++++++++++++++++++++++++++++++++--- parcel_test.go | 93 +++++++++++++++++++++++++++++++++++++++++++++---- tracker.db | Bin 61440 -> 61440 bytes 5 files changed, 167 insertions(+), 13 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0dz09t z6Pxs%2CBw!xAB~%#sOM;e=SAknryp(-DNXu=EeSfAKCkvw!_d_Lm#59hoe`dVKCzY z0GL=OV85{Q>=^50o-!NEJTu00G7YXR*OF_>)#Exwum8VKqgJY=WRQlnC#dFnf&Lkl z`UYZgDJn(cQY_AMywJiOZ}D;6KEKEZMJ^Bmpq8Z(%S>7|VZSJF2zGAifgzz+^w0#J zraV~lh&1lTYTdDTI6jKhmk1{TJydf`fk_ey-Qh?iD#c<&j!9q>mUWd$RdMVSkYmSh zBk;NcL!GG~>UXSa>8s?p&@jx^*e|MqZCKaEQ;)P9`+}mNIHnB1_Kh+yEG`*IZC}vo zI2SOk&oMEq#z6q=r?IXJgY#7!^Bt(h_5%iB+jdnLoqr@mNo`B%cdQ27GVEB5>%y|Y z*LGwWR($D^EDpcNwj=-Os<3s>2>gNaKwa-K(PEu7>{#(&y^Ljz+TWIx80NJ(UxygL zHMa7V=yI^x0Bp$=ml#&)TttiIxk1NS50+~tT;s(1&JxS{CIl$@aA&ui)rV*4IwQ1s zTVuk&?1=FRYHIUqgMLX|5|^QC=bNV8Y>zW{=U`ZQ>Y>4>bVT#f99yk--d zK2y!G{8%b%(z%vJ0v{;*KlN$7id!y-YHRA(pkZ#vBfBatYT%`GtuDVxW_q)u`4~=e)U{1ZG&|T07t#m@2si{2;&7NUZ=8fC%yjBVQ zXf(8kJVS)m0}mR2+XkQo6t|=b9ZA*F-j4z*+@;DNS~bqwYXQo+n%UXTcU&_6{T-sf zhrCjGy!f_|r6YQ2bO9d%_U2@rkQD*Zg;#!(PReiOHF??VmS48I(eKIhGCNHKF=sS_O&^;Nh zq!a0zXq}Y2;+AJo`h=V+Sn?HKR9?nH@KSu)wLD3OTK1F9@A=zXykA04^q~Wlv=jQ0 NF5E_N9rWCp#lJ+L@|*ww delta 63 zcmV-F0Kor%-~)i*1CSa504k9jLIwaT04{F0v1Fnj2=xFD^$*w&*s~E3$`6y+FB=VT VVF>{P83=G;a${v|q7V?GK(L$e6z%{3 From 5e144adfa524ae53f1158d9ccff25feb9a2cc9ca Mon Sep 17 00:00:00 2001 From: Nikita Pozdeev Date: Tue, 12 Aug 2025 23:11:11 +0300 Subject: [PATCH 2/2] second commit --- main.go | 2 ++ parcel.go | 35 +++++++++++------------------------ parcel_test.go | 40 +++++++++++++++++++++------------------- tracker.db | Bin 61440 -> 61440 bytes 4 files changed, 34 insertions(+), 43 deletions(-) diff --git a/main.go b/main.go index 8f7e50a0..0b7cbfa9 100644 --- a/main.go +++ b/main.go @@ -104,6 +104,8 @@ func main() { return } + defer db.Close() + // создайте объект ParcelStore функцией NewParcelStore store := NewParcelStore(db) service := NewParcelService(store) diff --git a/parcel.go b/parcel.go index 877ff86f..29a8e5bc 100644 --- a/parcel.go +++ b/parcel.go @@ -65,10 +65,14 @@ func (s ParcelStore) GetByClient(client int) ([]Parcel, error) { if err != nil { return []Parcel{}, err } - res = append(res, cl) } + err = rows.Err() + if err != nil { + return []Parcel{}, err + } + return res, nil } @@ -86,44 +90,27 @@ func (s ParcelStore) SetStatus(number int, status string) error { func (s ParcelStore) SetAddress(number int, address string) error { // реализуйте обновление адреса в таблице parcel // менять адрес можно только если значение статуса registered - row := s.db.QueryRow("SELECT status FROM parcel WHERE number = :number", - sql.Named("number", number)) - var status string - err := row.Scan(&status) + _, err := s.db.Exec("UPDATE parcel SET address = :address WHERE number = :number AND status = :status", + sql.Named("address", address), + sql.Named("number", number), + sql.Named("status", "registered")) if err != nil { return err } - if status == ParcelStatusRegistered { - _, err := s.db.Exec("UPDATE parcel SET address = :address WHERE number = :number", - sql.Named("address", address), - sql.Named("number", number)) - if err != nil { - return err - } - } return nil } func (s ParcelStore) Delete(number int) error { // реализуйте удаление строки из таблицы parcel // удалять строку можно только если значение статуса registered - row := s.db.QueryRow("SELECT status FROM parcel WHERE number = :number", - sql.Named("number", number)) - var status string - err := row.Scan(&status) + _, err := s.db.Exec("DELETE FROM parcel WHERE number = :number AND status = :status", sql.Named("number", number), + sql.Named("status", "registered")) if err != nil { return err } - if status == ParcelStatusRegistered { - _, err := s.db.Exec("DELETE FROM parcel WHERE number = :number", sql.Named("number", number)) - if err != nil { - return err - } - } - return nil } diff --git a/parcel_test.go b/parcel_test.go index 677e6ab9..5bec4a8e 100644 --- a/parcel_test.go +++ b/parcel_test.go @@ -33,9 +33,8 @@ func getTestParcel() Parcel { func TestAddGetDelete(t *testing.T) { // prepare db, err := sql.Open("sqlite", "tracker.db") - if err != nil { - t.Error(err) - } + require.NoError(t, err) + defer db.Close() _, err = db.Exec("DELETE FROM parcel") // - очистка @@ -74,9 +73,8 @@ func TestAddGetDelete(t *testing.T) { func TestSetAddress(t *testing.T) { // prepare db, err := sql.Open("sqlite", "tracker.db") - if err != nil { - t.Error(err) - } + require.NoError(t, err) + defer db.Close() _, err = db.Exec("DELETE FROM parcel") // - очистка @@ -99,18 +97,20 @@ func TestSetAddress(t *testing.T) { // check // получите добавленную посылку и убедитесь, что адрес обновился - p, err := store.Get(num) + parcelNew, err := store.Get(num) require.NoError(t, err) - assert.Equal(t, p.Address, newAddress) + + parcel.Address = newAddress + parcel.Number = num + assert.Equal(t, parcel, parcelNew) } // TestSetStatus проверяет обновление статуса func TestSetStatus(t *testing.T) { // prepare db, err := sql.Open("sqlite", "tracker.db") - if err != nil { - t.Error(err) - } + require.NoError(t, err) + defer db.Close() _, err = db.Exec("DELETE FROM parcel") // - очистка @@ -133,9 +133,12 @@ func TestSetStatus(t *testing.T) { // check // получите добавленную посылку и убедитесь, что статус обновился - p, err := store.Get(num) + parcelNewS, err := store.Get(num) require.NoError(t, err) - assert.Equal(t, p.Status, newStatus) + + parcel.Status = newStatus + parcel.Number = num + assert.Equal(t, parcelNewS, parcel) } @@ -143,9 +146,8 @@ func TestSetStatus(t *testing.T) { func TestGetByClient(t *testing.T) { // prepare db, err := sql.Open("sqlite", "tracker.db") - if err != nil { - t.Error(err) - } + require.NoError(t, err) + defer db.Close() _, err = db.Exec("DELETE FROM parcel") // - очистка @@ -190,11 +192,11 @@ func TestGetByClient(t *testing.T) { // убедитесь, что количество полученных посылок совпадает с количеством добавленных // check - for _, parcel := range storedParcels { - - assert.Equal(t, parcelMap[parcel.Number], parcel) + for i := 0; i < len(parcelMap); i ++ { + assert.Equal(t, parcelMap[storedParcels[i].Number], storedParcels[i]) // в parcelMap лежат добавленные посылки, ключ - идентификатор посылки, значение - сама посылка // убедитесь, что все посылки из storedParcels есть в parcelMap // убедитесь, что значения полей полученных посылок заполнены верно + assert.NotEmpty(t, parcelMap[storedParcels[i].Number]) } } diff --git a/tracker.db b/tracker.db index 805fe4a3e5154c62389ece5688783fa65009239d..3599dd31dbbfd71feca038c849fa886f707f39a4 100644 GIT binary patch delta 179 zcmZp8z})bFd4d!Zllw#&Cm^{oVV=GiqZ}^-0|PUE83X?%{w4fn{M>vC_)Is87%1{h zUSOBNXB1*+Ze?m?MnfrXW^NtAYzEFL)-6gi;LFnyc<+cRze04ZxK6#xJL delta 186 zcmZp8z})bFd4d!ZBiBS3Cm^{oVV=GiLk}+l0|N^`Hv|7A{w4fn{M>vC_^xgiF;L{2 zEN{)rVQg+?Y80iDI$6d}5?LSxCctEDKH1bRfy*Go(8S8X*viCUGM9ZOzllMVb|V)X n1GA#2sSWqT$pY3gLZ+5hhGsxvPVB-QD8j5@)tmp@Gj0F?4U8+J