snf_core 0.2.8 → 0.2.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +0 -0
  3. data/README.md +0 -0
  4. data/Rakefile +0 -0
  5. data/app/controllers/concerns/common.rb +0 -0
  6. data/app/controllers/concerns/pagination.rb +0 -0
  7. data/app/controllers/snf_core/application_controller.rb +33 -0
  8. data/app/controllers/snf_core/auth_controller.rb +70 -0
  9. data/app/jobs/snf_core/application_job.rb +0 -0
  10. data/app/mailers/snf_core/application_mailer.rb +0 -0
  11. data/app/mailers/snf_core/auth_mailer.rb +13 -0
  12. data/app/models/snf_core/address.rb +0 -0
  13. data/app/models/snf_core/application_record.rb +0 -0
  14. data/app/models/snf_core/business.rb +0 -0
  15. data/app/models/snf_core/business_document.rb +15 -15
  16. data/app/models/snf_core/category.rb +0 -0
  17. data/app/models/snf_core/customer_group.rb +0 -0
  18. data/app/models/snf_core/delivery_order.rb +42 -0
  19. data/app/models/snf_core/group.rb +0 -0
  20. data/app/models/snf_core/order.rb +68 -0
  21. data/app/models/snf_core/order_item.rb +30 -0
  22. data/app/models/snf_core/product.rb +0 -0
  23. data/app/models/snf_core/role.rb +8 -0
  24. data/app/models/snf_core/store.rb +0 -0
  25. data/app/models/snf_core/store_inventory.rb +0 -0
  26. data/app/models/snf_core/user.rb +18 -18
  27. data/app/models/snf_core/user_role.rb +6 -0
  28. data/app/models/snf_core/wallet.rb +0 -0
  29. data/app/services/snf_core/token_service.rb +16 -0
  30. data/app/views/layouts/snf_core/mailer.html.erb +64 -0
  31. data/app/views/layouts/snf_core/mailer.text.erb +1 -0
  32. data/app/views/snf_core/auth_mailer/reset_password.html.erb +10 -0
  33. data/config/routes.rb +5 -0
  34. data/db/migrate/20250226042622_create_snf_core_users.rb +13 -14
  35. data/db/migrate/20250226064444_create_snf_core_categories.rb +0 -0
  36. data/db/migrate/20250226080323_create_snf_core_businesses.rb +0 -0
  37. data/db/migrate/20250226102931_create_snf_core_business_documents.rb +0 -0
  38. data/db/migrate/20250226110217_create_snf_core_addresses.rb +0 -0
  39. data/db/migrate/20250226115215_create_snf_core_stores.rb +0 -0
  40. data/db/migrate/20250226181007_create_snf_core_products.rb +0 -0
  41. data/db/migrate/20250226190000_create_snf_core_store_inventories.rb +0 -0
  42. data/db/migrate/20250226192104_create_snf_core_groups.rb +0 -0
  43. data/db/migrate/20250226193938_create_snf_core_customer_groups.rb +0 -0
  44. data/db/migrate/20250227075048_create_snf_core_wallets.rb +0 -0
  45. data/db/migrate/20250227102833_modify_store_inventories.rb +0 -0
  46. data/db/migrate/20250305165926_create_snf_core_orders.rb +12 -0
  47. data/db/migrate/20250305170248_create_snf_core_order_items.rb +13 -0
  48. data/db/migrate/20250305201008_create_snf_core_delivery_orders.rb +15 -0
  49. data/db/migrate/20250305232529_create_snf_core_roles.rb +9 -0
  50. data/db/migrate/20250305232530_create_snf_core_user_roles.rb +10 -0
  51. data/db/migrate/20250306074713_add_password_fields_to_snf_core_users.rb +7 -0
  52. data/lib/snf_core/engine.rb +0 -0
  53. data/lib/snf_core/version.rb +1 -1
  54. data/lib/snf_core.rb +0 -0
  55. data/lib/tasks/snf_core_tasks.rake +0 -0
  56. data/spec/dummy/Rakefile +6 -0
  57. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  58. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  59. data/spec/dummy/app/jobs/application_job.rb +7 -0
  60. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  61. data/spec/dummy/app/models/application_record.rb +3 -0
  62. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  63. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  64. data/spec/dummy/bin/dev +2 -0
  65. data/spec/dummy/bin/rails +4 -0
  66. data/spec/dummy/bin/rake +4 -0
  67. data/spec/dummy/bin/setup +34 -0
  68. data/spec/dummy/config/application.rb +43 -0
  69. data/spec/dummy/config/boot.rb +5 -0
  70. data/spec/dummy/config/cable.yml +10 -0
  71. data/spec/dummy/config/database.yml +20 -0
  72. data/spec/dummy/config/environment.rb +5 -0
  73. data/spec/dummy/config/environments/development.rb +86 -0
  74. data/spec/dummy/config/environments/production.rb +86 -0
  75. data/spec/dummy/config/environments/test.rb +53 -0
  76. data/spec/dummy/config/initializers/cors.rb +16 -0
  77. data/spec/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  78. data/spec/dummy/config/initializers/inflections.rb +16 -0
  79. data/spec/dummy/config/locales/en.yml +31 -0
  80. data/spec/dummy/config/puma.rb +38 -0
  81. data/spec/dummy/config/routes.rb +3 -0
  82. data/spec/dummy/config/storage.yml +38 -0
  83. data/spec/dummy/config.ru +6 -0
  84. data/spec/dummy/db/migrate/20250226123213_create_active_storage_tables.active_storage.rb +57 -0
  85. data/spec/dummy/db/schema.rb +242 -0
  86. data/spec/dummy/log/development.log +3026 -0
  87. data/spec/dummy/log/test.log +133760 -0
  88. data/spec/dummy/spec/fixtures/files/sample.pdf +0 -0
  89. data/spec/dummy/tmp/letter_opener/1741263210_267596_73bfefe/rich.html +142 -0
  90. data/spec/dummy/tmp/letter_opener/1741263645_7876108_3edd95c/rich.html +132 -0
  91. data/spec/dummy/tmp/letter_opener/1741263812_8855171_0bf8e2b/rich.html +132 -0
  92. data/spec/dummy/tmp/local_secret.txt +1 -0
  93. data/spec/dummy/tmp/pids/server.pid +1 -0
  94. data/spec/dummy/tmp/restart.txt +0 -0
  95. data/spec/dummy/tmp/storage/05/zb/05zbh3dr63t1ktnsxkwk2ugbglbu +0 -0
  96. data/spec/dummy/tmp/storage/0u/er/0uerkm5uy46p3lvg18c7ond00lih +0 -0
  97. data/spec/dummy/tmp/storage/13/1y/131yod70wqijazn3ix829yvuuvge +0 -0
  98. data/spec/dummy/tmp/storage/16/na/16na9nc1z98jt6fyn3axj3bhudes +0 -0
  99. data/spec/dummy/tmp/storage/17/wb/17wbd1yhh3pyg3j1sko570vsjnpq +0 -0
  100. data/spec/dummy/tmp/storage/1e/s9/1es9g1a309tf4bs04mr0i70usjz1 +0 -0
  101. data/spec/dummy/tmp/storage/1j/tj/1jtjythzzcpbajktrsn08af3x66m +0 -0
  102. data/spec/dummy/tmp/storage/1t/oy/1toyz0i6f9u5xexr4cpwttr04ood +0 -0
  103. data/spec/dummy/tmp/storage/1v/u3/1vu3btk2ukaxgp84qfmk5izonqmi +0 -0
  104. data/spec/dummy/tmp/storage/1x/i3/1xi33eqr5ipoaz0upakb8yy7qc4o +0 -0
  105. data/spec/dummy/tmp/storage/22/xs/22xscg5bqqtdykdaxrbr388lxkmf +0 -0
  106. data/spec/dummy/tmp/storage/24/69/2469t9kpepg4fd8ki960h025li0b +0 -0
  107. data/spec/dummy/tmp/storage/2a/0u/2a0uyihfk1wn5c1fuz09unocwy2m +0 -0
  108. data/spec/dummy/tmp/storage/2e/f9/2ef9j9go5h1v9ain8zq8m9zpjsf3 +0 -0
  109. data/spec/dummy/tmp/storage/2i/e3/2ie3ve4rajer9sx5zf6r45b3r9ar +0 -0
  110. data/spec/dummy/tmp/storage/2n/56/2n569vuf39piqdtbtbxsztn3r6kl +0 -0
  111. data/spec/dummy/tmp/storage/2o/te/2ote6co29576cnoptsem3lhupuxy +0 -0
  112. data/spec/dummy/tmp/storage/32/ur/32ur9eb5d0h01m2oe9kc5avpm31u +0 -0
  113. data/spec/dummy/tmp/storage/35/ov/35ovg8m7ij4fjqy3v4bh28e5hld2 +0 -0
  114. data/spec/dummy/tmp/storage/37/x2/37x2up33wqtrua85c089e6ltr49p +0 -0
  115. data/spec/dummy/tmp/storage/3i/8d/3i8dbcb1dk9ri0kumm3th8wo61gc +0 -0
  116. data/spec/dummy/tmp/storage/3u/jh/3ujhd5drl4t2nfbqw7ij2jzijxn1 +0 -0
  117. data/spec/dummy/tmp/storage/41/ud/41udni7kfampfsa6dwynr7273y3v +0 -0
  118. data/spec/dummy/tmp/storage/44/ww/44wwsc9by5wv1u70y9suhuq92bwi +0 -0
  119. data/spec/dummy/tmp/storage/4b/qe/4bqe6i8rtzlu196bvama05xnumrb +0 -0
  120. data/spec/dummy/tmp/storage/4n/9p/4n9pgwj5byodmx46ffhpvlydbrmh +0 -0
  121. data/spec/dummy/tmp/storage/4t/86/4t862kv9wcz0p7wgdvpmtmczdadt +0 -0
  122. data/spec/dummy/tmp/storage/4t/ke/4tkejzaafw2hopionhrbemj6jrij +0 -0
  123. data/spec/dummy/tmp/storage/4u/gx/4ugxo9x3cqbwg3d58u13xmtgc6f6 +0 -0
  124. data/spec/dummy/tmp/storage/57/kn/57kn4d3oyb3uqr0y0hwq4wl4d80i +0 -0
  125. data/spec/dummy/tmp/storage/5j/ls/5jlsuxajthpnn769oy836amrsavi +0 -0
  126. data/spec/dummy/tmp/storage/5n/ys/5nyszrcfj6fl2spwxjn1yea42ax0 +0 -0
  127. data/spec/dummy/tmp/storage/5s/zb/5szbksq6mg3768g9vtk788gc49gw +0 -0
  128. data/spec/dummy/tmp/storage/5y/zf/5yzft7e8r6cz5pcu78z6jj8dhmbz +0 -0
  129. data/spec/dummy/tmp/storage/62/jx/62jxz09uvpyv1okycwh7mv6z0gz5 +0 -0
  130. data/spec/dummy/tmp/storage/66/ed/66edq851b58dvses2okkafxtn827 +0 -0
  131. data/spec/dummy/tmp/storage/6a/8k/6a8k0jyqprv0z2q3a0p9bwiyy8av +0 -0
  132. data/spec/dummy/tmp/storage/6d/4e/6d4eiwu6oegnp12mwt27bwhkxe8v +0 -0
  133. data/spec/dummy/tmp/storage/6g/dc/6gdc40iivivwbln1zs4dqedt5ni7 +0 -0
  134. data/spec/dummy/tmp/storage/6m/ry/6mrynv03esjb64ohdo4q4xd0wr6t +0 -0
  135. data/spec/dummy/tmp/storage/6o/7a/6o7ax3ihg25bswxp4d601mqo7tl3 +0 -0
  136. data/spec/dummy/tmp/storage/6w/uj/6wujip3kahx619bqpcc4myv7tz5n +0 -0
  137. data/spec/dummy/tmp/storage/6z/86/6z862zpc67sikzl0otbf418t2clj +0 -0
  138. data/spec/dummy/tmp/storage/70/pb/70pbs8mjus3udsitby6gasexg4qz +0 -0
  139. data/spec/dummy/tmp/storage/71/rq/71rqssbyrwzhseipt1ojj2aucm2f +0 -0
  140. data/spec/dummy/tmp/storage/74/nt/74ntaj9azigfadsry359nl8jwbva +0 -0
  141. data/spec/dummy/tmp/storage/76/qk/76qkxksbv7v7meswa7mcnshr777l +0 -0
  142. data/spec/dummy/tmp/storage/7g/z0/7gz0olv00p0i3xqdy3f4fa6e73u2 +0 -0
  143. data/spec/dummy/tmp/storage/82/zv/82zvnds6te3el62i8vxv8rzkc4ms +0 -0
  144. data/spec/dummy/tmp/storage/83/b1/83b1ejivo3bxawg0kv4f1jufwarp +0 -0
  145. data/spec/dummy/tmp/storage/84/xr/84xr5dqonkroxjj0nkf3cznat5qt +0 -0
  146. data/spec/dummy/tmp/storage/8q/oh/8qohqcrf9fh6oc374ewp0lxid5lf +0 -0
  147. data/spec/dummy/tmp/storage/8v/yv/8vyvd9q13xzmav17gvu5tr1mvlws +0 -0
  148. data/spec/dummy/tmp/storage/91/35/9135ona6a51xpv669i6wz75kz8pr +0 -0
  149. data/spec/dummy/tmp/storage/92/hw/92hw9u9j6728qgwpcn7oqphe9tzj +0 -0
  150. data/spec/dummy/tmp/storage/9a/3q/9a3qd5qc7j6dzzmg16wcpvwoowmp +0 -0
  151. data/spec/dummy/tmp/storage/9b/2w/9b2w9oc0quy4lsa7y4zvvq8pfnh5 +0 -0
  152. data/spec/dummy/tmp/storage/9p/cd/9pcdjfvbqndd5dxue0ttlfeew1ht +0 -0
  153. data/spec/dummy/tmp/storage/al/8s/al8szf81ccm4ckpvxh3bv6vlgp0y +0 -0
  154. data/spec/dummy/tmp/storage/ao/tx/aotxomcc2m5ojywmr335fc27br55 +0 -0
  155. data/spec/dummy/tmp/storage/as/3k/as3k29j61efclm810sdnopepmgl2 +0 -0
  156. data/spec/dummy/tmp/storage/b0/wa/b0wa1zer7y7x8udydx3puofxd3fd +0 -0
  157. data/spec/dummy/tmp/storage/b8/8l/b88ln7wuq13v4akgwgc0dgac8887 +0 -0
  158. data/spec/dummy/tmp/storage/bb/iy/bbiyfh0r4f3szj4bmfwp7ptcst6k +0 -0
  159. data/spec/dummy/tmp/storage/bg/h0/bgh0cuyn7744wfbm8zuob9lugpxu +0 -0
  160. data/spec/dummy/tmp/storage/bi/6q/bi6qcv9yadwuy9au0q4vojvtqibp +0 -0
  161. data/spec/dummy/tmp/storage/bm/s6/bms684574m329zo33bmdzw4y05q8 +0 -0
  162. data/spec/dummy/tmp/storage/bn/8g/bn8gi5i69ysnnedgg57lg6r48hc0 +0 -0
  163. data/spec/dummy/tmp/storage/bp/0h/bp0hrk5xcf4q8q4b4ypo17ngqy93 +0 -0
  164. data/spec/dummy/tmp/storage/bs/y9/bsy9t4961ra8hwlq06wjtgrrcflp +0 -0
  165. data/spec/dummy/tmp/storage/ca/u3/cau32ihv1n1onmqmxf9pbpvwwp42 +0 -0
  166. data/spec/dummy/tmp/storage/ck/1p/ck1pqdlwjggav333jasfbrtptqs8 +0 -0
  167. data/spec/dummy/tmp/storage/ck/nb/cknbno5x3oh0nzvrry51ai2c2ce9 +0 -0
  168. data/spec/dummy/tmp/storage/cp/xd/cpxd4pz21lel4kv0463co0i34dyo +0 -0
  169. data/spec/dummy/tmp/storage/cq/25/cq25o59ipbdrfn01mtjvi5dwc8v0 +0 -0
  170. data/spec/dummy/tmp/storage/cq/os/cqosgu11l61u6gdz0c54mr4hasry +0 -0
  171. data/spec/dummy/tmp/storage/cs/x9/csx9mv26ab1lm82a7itryfq4v6rq +0 -0
  172. data/spec/dummy/tmp/storage/d5/aa/d5aag1rh6b9stocz1m1pg5c8mnfw +0 -0
  173. data/spec/dummy/tmp/storage/dm/c1/dmc1zx12pfl41f9br9f1l86953ew +0 -0
  174. data/spec/dummy/tmp/storage/dp/0f/dp0fx9ji1bqvx1najwjgns6n7fhf +0 -0
  175. data/spec/dummy/tmp/storage/dq/04/dq04jlw82vqiecdsxyrspe3y8zhd +0 -0
  176. data/spec/dummy/tmp/storage/dq/p8/dqp8o7eqfob92n81thzhj4mmviwf +0 -0
  177. data/spec/dummy/tmp/storage/dr/1z/dr1z3xxvya5ywessdrhmk05b2apz +0 -0
  178. data/spec/dummy/tmp/storage/dr/6z/dr6z0vwwsxqzw0kfkwl598uciyft +0 -0
  179. data/spec/dummy/tmp/storage/dx/iu/dxiu87gi66esp528s27d805z6b1v +0 -0
  180. data/spec/dummy/tmp/storage/e2/uo/e2uoyhzlaj5538p6rjs37pbl0z9g +0 -0
  181. data/spec/dummy/tmp/storage/ef/ih/efihy3gyspz150a8mpmhvj01xr07 +0 -0
  182. data/spec/dummy/tmp/storage/ej/20/ej20a2w7j929ut3zwo0kk5zyzp96 +0 -0
  183. data/spec/dummy/tmp/storage/ek/3j/ek3jzmz9919dhom6hbmhglq7e64b +0 -0
  184. data/spec/dummy/tmp/storage/em/kc/emkc4tc71k65mfcurv6k8z1ylswl +0 -0
  185. data/spec/dummy/tmp/storage/em/vx/emvx0c15o74mr0nlcvdc7m88j2gi +0 -0
  186. data/spec/dummy/tmp/storage/ew/n0/ewn0vyho1jbc7i76nat14codqc38 +0 -0
  187. data/spec/dummy/tmp/storage/f8/hf/f8hf7vk5c1h8s3upvdsgqbrdkokl +0 -0
  188. data/spec/dummy/tmp/storage/fo/9s/fo9s4w4egoj3qjbwknubsr4m3hca +0 -0
  189. data/spec/dummy/tmp/storage/fq/m7/fqm72ukjmyc0t6mgh73ehovlhm7i +0 -0
  190. data/spec/dummy/tmp/storage/ga/7e/ga7eiyyv0llme2i4xby0kdp4a4h8 +0 -0
  191. data/spec/dummy/tmp/storage/gc/bb/gcbbnsf6rq5xftpvxt4vfo39v2tx +0 -0
  192. data/spec/dummy/tmp/storage/gc/nn/gcnnb8yfz775d91vymz929zy2b7l +0 -0
  193. data/spec/dummy/tmp/storage/gv/kd/gvkd1h6f6qqh334ybfn71lwi6xk0 +0 -0
  194. data/spec/dummy/tmp/storage/gy/t2/gyt2tfjun5ezlgnl6u2ozz2s5wt9 +0 -0
  195. data/spec/dummy/tmp/storage/h0/i7/h0i7pyghnhpzsss74tk1k9k69yo4 +0 -0
  196. data/spec/dummy/tmp/storage/h4/86/h486d2xris442m90oylhhdlj1pjg +0 -0
  197. data/spec/dummy/tmp/storage/h4/vg/h4vgoatz21dhjrztrrbg2hdhkwjb +0 -0
  198. data/spec/dummy/tmp/storage/h5/13/h513cys269xn45jdhxhfyjlq5b3q +0 -0
  199. data/spec/dummy/tmp/storage/hb/yf/hbyf2wemy2azh7k1qhn3to9cpbj1 +0 -0
  200. data/spec/dummy/tmp/storage/hi/9h/hi9ho77symoy2j0ye28fxgnxw3kt +0 -0
  201. data/spec/dummy/tmp/storage/hl/yy/hlyyu150rt2yos1sa9ed1qw49y26 +0 -0
  202. data/spec/dummy/tmp/storage/hm/la/hmlataprq9fsh3126h6zmi19u2u1 +0 -0
  203. data/spec/dummy/tmp/storage/hp/6k/hp6kbroei8cm1chsl2bxhrpbkh1s +0 -0
  204. data/spec/dummy/tmp/storage/hr/mb/hrmb0w1dnyo6750fj1866f5np7sm +0 -0
  205. data/spec/dummy/tmp/storage/i9/6r/i96r6te3tutbwgxgl0maf3tgud51 +0 -0
  206. data/spec/dummy/tmp/storage/ih/xa/ihxalwtv9q6k97ryw0x3di5or5xw +0 -0
  207. data/spec/dummy/tmp/storage/in/jg/injgf3gi3v8yhpjwy4h8s96k0w8x +0 -0
  208. data/spec/dummy/tmp/storage/ir/zq/irzqn6i8886usqy6bcnsghmr01kg +0 -0
  209. data/spec/dummy/tmp/storage/iw/19/iw191t6h61ig4a68n3rk73vjvldc +0 -0
  210. data/spec/dummy/tmp/storage/j0/jz/j0jz8g89xbvv61ou1cj7dztym5k3 +0 -0
  211. data/spec/dummy/tmp/storage/j6/ym/j6ymkvvvhcdf7snmc6cardtsy9nd +0 -0
  212. data/spec/dummy/tmp/storage/j7/6x/j76x0oirv7i4t6p3blseuaknp7pw +0 -0
  213. data/spec/dummy/tmp/storage/jq/95/jq95rqhv5usgucn2d2mmkhjufapu +0 -0
  214. data/spec/dummy/tmp/storage/jr/uw/jruwp015m0chh50nxgkklum2ta3u +0 -0
  215. data/spec/dummy/tmp/storage/jz/ku/jzku30iopsxhh5quij3dov92vpyd +0 -0
  216. data/spec/dummy/tmp/storage/k0/wi/k0wijnkceisaxvkmc3hbr4croete +0 -0
  217. data/spec/dummy/tmp/storage/kk/76/kk76rr3nfbi1r4cmw9rcxuorpv4y +0 -0
  218. data/spec/dummy/tmp/storage/kn/z4/knz4o9yqqnipvbbo2fum9sz2528v +0 -0
  219. data/spec/dummy/tmp/storage/ky/1y/ky1ys68lmat11bxs2395dqugiyig +0 -0
  220. data/spec/dummy/tmp/storage/kz/4h/kz4hr1f97wfp44jkt5i3tvheo2hm +0 -0
  221. data/spec/dummy/tmp/storage/l4/ge/l4gelxdup4epl7lv9x5qyhatk2l6 +0 -0
  222. data/spec/dummy/tmp/storage/l5/3j/l53jq75i2ywyslq3wl999vl2jmyz +0 -0
  223. data/spec/dummy/tmp/storage/la/a6/laa6ye8vmuyl7m1gjpkcx19cdpzq +0 -0
  224. data/spec/dummy/tmp/storage/li/di/lidigrxrlew69ebcfx5ubeb203ck +0 -0
  225. data/spec/dummy/tmp/storage/ln/0f/ln0fz4opsdycu80q7urfez9ar7kn +0 -0
  226. data/spec/dummy/tmp/storage/lr/6l/lr6lqlqemfz0aorfbyot2lo9ck4o +0 -0
  227. data/spec/dummy/tmp/storage/lu/no/lunox74fm54ctc4qbfo2lj9l56sv +0 -0
  228. data/spec/dummy/tmp/storage/lv/o6/lvo6jno7mebvf0hssv20pgwfyum6 +0 -0
  229. data/spec/dummy/tmp/storage/m0/tm/m0tml6mrt7hiab73wgr0m9kaizn6 +0 -0
  230. data/spec/dummy/tmp/storage/mg/z6/mgz6nnkcl4j37w3ev6yolkfxe95o +0 -0
  231. data/spec/dummy/tmp/storage/mk/4w/mk4w528bsn47ewri0odui9s40f87 +0 -0
  232. data/spec/dummy/tmp/storage/ms/l9/msl9xauqjm3xnmfpxuiccmznlvnr +0 -0
  233. data/spec/dummy/tmp/storage/mu/ln/muln4ptnkbcff0s2p54j36goygbx +0 -0
  234. data/spec/dummy/tmp/storage/na/6r/na6rrohinrnjofsq27u95up5rp8k +0 -0
  235. data/spec/dummy/tmp/storage/nd/9y/nd9yeusukf9brbkzbm7af1yygidd +0 -0
  236. data/spec/dummy/tmp/storage/nf/sp/nfspv0s1uw5xo4qtxd8vsvvqy9v7 +0 -0
  237. data/spec/dummy/tmp/storage/nr/f9/nrf9wi6n0guazfp9gluc36do0dx1 +0 -0
  238. data/spec/dummy/tmp/storage/nw/le/nwle0hzkvkdl27fqqtm4nmpgzcvp +0 -0
  239. data/spec/dummy/tmp/storage/nx/64/nx64klyyxu3u3qz5lov4zf23fgco +0 -0
  240. data/spec/dummy/tmp/storage/nz/kd/nzkd3xlsbohxa2dgfyrz26iqb723 +0 -0
  241. data/spec/dummy/tmp/storage/o6/xf/o6xfczmxpom0laekvp59gute2p5d +0 -0
  242. data/spec/dummy/tmp/storage/oc/f8/ocf8zs18lm9fnkpqj6wpshdpyf43 +0 -0
  243. data/spec/dummy/tmp/storage/oc/xk/ocxkae9a9kkycvpfw71sdhnpqn85 +0 -0
  244. data/spec/dummy/tmp/storage/oe/bq/oebq593a6bpwkbxpx6segtwyy0jy +0 -0
  245. data/spec/dummy/tmp/storage/p5/4w/p54wycc6tln36b54yfsz2zk7hcdt +0 -0
  246. data/spec/dummy/tmp/storage/p9/hd/p9hddsr7pgksgl6vuqgtkp1ad7x2 +0 -0
  247. data/spec/dummy/tmp/storage/ph/va/phvajdvl6g28vluah7d38rpaj2el +0 -0
  248. data/spec/dummy/tmp/storage/pi/4i/pi4izeatwyrz6e8zdwvri4f4h4tl +0 -0
  249. data/spec/dummy/tmp/storage/pu/rl/purlhr67132j7c4k548memz2w2q1 +0 -0
  250. data/spec/dummy/tmp/storage/pv/bo/pvboa7wami2p1zjkuytzj9epmj14 +0 -0
  251. data/spec/dummy/tmp/storage/q5/i8/q5i8dg12fdmm5jura53gaw3zj6u4 +0 -0
  252. data/spec/dummy/tmp/storage/qn/1h/qn1hgmvsrnd8dkn4nvcyvqy3q2sb +0 -0
  253. data/spec/dummy/tmp/storage/qp/hi/qphia48836lod6l2ao5ca6ocd8ws +0 -0
  254. data/spec/dummy/tmp/storage/qs/jk/qsjkqiiarr85uobud0qsnnmpraol +0 -0
  255. data/spec/dummy/tmp/storage/qw/7z/qw7zsf91njf7ga6454nrjpvddjn5 +0 -0
  256. data/spec/dummy/tmp/storage/r6/6f/r66f8sxtwvlk8c1ava46bgua5hn0 +0 -0
  257. data/spec/dummy/tmp/storage/ra/6b/ra6b797wpupx6nqkgne3d63j6lh2 +0 -0
  258. data/spec/dummy/tmp/storage/ra/s0/ras0iwcg9lufnjah5yxyola73jsk +0 -0
  259. data/spec/dummy/tmp/storage/rd/e4/rde4tqu10zhrceb4uvvorhse4itt +0 -0
  260. data/spec/dummy/tmp/storage/rh/0h/rh0h80b8er9vp1u8dcocy1u58obf +0 -0
  261. data/spec/dummy/tmp/storage/ro/wb/rowb68g2iif1e8hsbjdjsmxj94h7 +0 -0
  262. data/spec/dummy/tmp/storage/s1/22/s122jwsnbcabv9fxp54nhoaaf34u +0 -0
  263. data/spec/dummy/tmp/storage/s6/on/s6onn1pu2bxcdkeebeu9qaht8i4d +0 -0
  264. data/spec/dummy/tmp/storage/s8/o0/s8o0enbem94835cqjla6onwncqpz +0 -0
  265. data/spec/dummy/tmp/storage/s9/lw/s9lwslyf5co34pvbt3n9ay06ui2w +0 -0
  266. data/spec/dummy/tmp/storage/sb/bo/sbboin8iacxsa7ywl1xp401f7tmj +0 -0
  267. data/spec/dummy/tmp/storage/sd/he/sdhe8pgaioyf7kdmdok21dy8enr3 +0 -0
  268. data/spec/dummy/tmp/storage/si/24/si24loctkg3h900v6vaoxwnruih7 +0 -0
  269. data/spec/dummy/tmp/storage/st/hv/sthv2tx2r8zv6tyn9yxi5am0pgzh +0 -0
  270. data/spec/dummy/tmp/storage/su/ng/sungqllfkjesc0p9c8hz3y2ior41 +0 -0
  271. data/spec/dummy/tmp/storage/sy/wq/sywqphj8vgv0imntn38s286yjjc3 +0 -0
  272. data/spec/dummy/tmp/storage/ta/s3/tas35nm4h81nhaecpeybk8kxzt62 +0 -0
  273. data/spec/dummy/tmp/storage/tc/gu/tcgurel05x9fk9ksm4hxwfla3hg3 +0 -0
  274. data/spec/dummy/tmp/storage/tk/rt/tkrtpgn5p68rqy679q15ab3j7twz +0 -0
  275. data/spec/dummy/tmp/storage/tm/ce/tmce54998rdnz191k02fzowpebvw +0 -0
  276. data/spec/dummy/tmp/storage/tt/pu/ttpumlt7wi54pohcc7ktsl5le777 +0 -0
  277. data/spec/dummy/tmp/storage/u1/vf/u1vfyawqqy7wpkthgardxs358car +0 -0
  278. data/spec/dummy/tmp/storage/u2/xa/u2xaxpjz4fdxtxxinaxq2r7biovv +0 -0
  279. data/spec/dummy/tmp/storage/uf/67/uf67aznvgtom02vj8q4jl60hycfm +0 -0
  280. data/spec/dummy/tmp/storage/ui/xi/uixi7xtks88zuqr4gwi6cjbk4m47 +0 -0
  281. data/spec/dummy/tmp/storage/uq/jk/uqjkltli1s6vz51g6yu551ze48c1 +0 -0
  282. data/spec/dummy/tmp/storage/ux/te/uxtezp2rqztn4cernmn7477gukxe +0 -0
  283. data/spec/dummy/tmp/storage/v4/yi/v4yieu5kcx0jz3ephiptzr46djev +0 -0
  284. data/spec/dummy/tmp/storage/va/sc/vascc4h0c7dv7uwwcn2wdvx6qyhy +0 -0
  285. data/spec/dummy/tmp/storage/vp/ub/vpub3n9dk3ts14cvq9tvkez7crqq +0 -0
  286. data/spec/dummy/tmp/storage/w2/3f/w23f3igzkn7bddqxry5x4wsu2ths +0 -0
  287. data/spec/dummy/tmp/storage/w4/1j/w41judbhn1j3quwhs36myqwnypkz +0 -0
  288. data/spec/dummy/tmp/storage/w4/d3/w4d3qfnguynfuw4oxo5hek8q5w66 +0 -0
  289. data/spec/dummy/tmp/storage/w9/na/w9na14949rr42w928n9srevxecbl +0 -0
  290. data/spec/dummy/tmp/storage/wo/81/wo813rsnwvoa55h0vq0fr79iajuw +0 -0
  291. data/spec/dummy/tmp/storage/wp/zs/wpzs5finp3t36za2bykcoxueu5b6 +0 -0
  292. data/spec/dummy/tmp/storage/wv/9t/wv9t3gxm6dqah7kdq74pimjdb156 +0 -0
  293. data/spec/dummy/tmp/storage/ww/40/ww40d8rykhlpxwfh0ggfs7mrh0jl +0 -0
  294. data/spec/dummy/tmp/storage/wy/14/wy14megn3o5zqplv9xg6u32uwkr6 +0 -0
  295. data/spec/dummy/tmp/storage/xd/4h/xd4h96rdmw5t9pujgz831cnfgj8o +0 -0
  296. data/spec/dummy/tmp/storage/xi/en/xiensi0706n8m0x5lxp0fbwg8ipk +0 -0
  297. data/spec/dummy/tmp/storage/xj/yy/xjyygdd3znvvpt9ufz1vv4lfsx3w +0 -0
  298. data/spec/dummy/tmp/storage/xs/x1/xsx109k9pb83qze3raurxo22dnms +0 -0
  299. data/spec/dummy/tmp/storage/xv/gf/xvgf6x0othqxlxcbgwz4sg7th3p9 +0 -0
  300. data/spec/dummy/tmp/storage/y5/3g/y53gv7ysx4j1y0k71pszym8sdu6b +0 -0
  301. data/spec/dummy/tmp/storage/ya/yf/yayfpxlrbtz0578nl9tlourrwe27 +0 -0
  302. data/spec/dummy/tmp/storage/yd/x8/ydx8jm52rnl3b7mpvmmxlilenllw +0 -0
  303. data/spec/dummy/tmp/storage/ye/bu/yebu3imdihqdatzktkubhkto82xo +0 -0
  304. data/spec/dummy/tmp/storage/yf/49/yf49a4ydheqf3cqs0u49sanbl4ms +0 -0
  305. data/spec/dummy/tmp/storage/yh/q1/yhq1muao2dpuykmj12bxhd0x4ntk +0 -0
  306. data/spec/dummy/tmp/storage/ym/5n/ym5ndg2m03vfnoeryvb9tex8xj72 +0 -0
  307. data/spec/dummy/tmp/storage/yx/jp/yxjpumjyo1jysjpg20qaxgsqg4fw +0 -0
  308. data/spec/dummy/tmp/storage/z1/gr/z1grp34d5vw7mi4g8vw8yfu91ny2 +0 -0
  309. data/spec/dummy/tmp/storage/z5/qs/z5qs5fq00igr3xv5izgcyhhsdw7y +0 -0
  310. data/spec/dummy/tmp/storage/z5/sg/z5sgd1au9gcfkqb3kq82f3yry6a6 +0 -0
  311. data/spec/dummy/tmp/storage/z7/8n/z78nuzozxx53c7cpp3e4kt3nghaa +0 -0
  312. data/spec/dummy/tmp/storage/zk/3v/zk3vlz1al2rba9wlkzoa6p8wpli0 +0 -0
  313. data/spec/dummy/tmp/storage/zk/xs/zkxsr1zywhaydz0cep4eh8mmos46 +0 -0
  314. data/spec/dummy/tmp/storage/zx/ur/zxuraz59df480azmknqbfeb37ktm +0 -0
  315. data/spec/examples.txt +126 -0
  316. data/spec/factories/snf_core/addresses.rb +10 -0
  317. data/spec/factories/snf_core/business_documents.rb +18 -0
  318. data/spec/factories/snf_core/businesses.rb +10 -0
  319. data/spec/factories/snf_core/categories.rb +7 -0
  320. data/spec/factories/snf_core/customer_groups.rb +9 -0
  321. data/spec/factories/snf_core/delivery_orders.rb +36 -0
  322. data/spec/factories/snf_core/groups.rb +6 -0
  323. data/spec/factories/snf_core/order_items.rb +9 -0
  324. data/spec/factories/snf_core/orders.rb +33 -0
  325. data/spec/factories/snf_core/products.rb +9 -0
  326. data/spec/factories/snf_core/roles.rb +5 -0
  327. data/spec/factories/snf_core/store_inventories.rb +8 -0
  328. data/spec/factories/snf_core/stores.rb +9 -0
  329. data/spec/factories/snf_core/user_roles.rb +6 -0
  330. data/spec/factories/snf_core/users.rb +12 -0
  331. data/spec/factories/snf_core/wallets.rb +7 -0
  332. data/spec/mailers/previews/snf_core/auth_mailer_preview.rb +6 -0
  333. data/spec/mailers/snf_core/auth_mailer_spec.rb +7 -0
  334. data/spec/models/snf_core/address_spec.rb +15 -0
  335. data/spec/models/snf_core/business_document_spec.rb +20 -0
  336. data/spec/models/snf_core/business_spec.rb +14 -0
  337. data/spec/models/snf_core/category_spec.rb +12 -0
  338. data/spec/models/snf_core/customer_group_spec.rb +11 -0
  339. data/spec/models/snf_core/delivery_order_spec.rb +70 -0
  340. data/spec/models/snf_core/group_spec.rb +11 -0
  341. data/spec/models/snf_core/order_item_spec.rb +64 -0
  342. data/spec/models/snf_core/order_spec.rb +81 -0
  343. data/spec/models/snf_core/product_spec.rb +17 -0
  344. data/spec/models/snf_core/role_spec.rb +12 -0
  345. data/spec/models/snf_core/store_inventory_spec.rb +24 -0
  346. data/spec/models/snf_core/store_spec.rb +13 -0
  347. data/spec/models/snf_core/user_role_spec.rb +11 -0
  348. data/spec/models/snf_core/user_spec.rb +22 -0
  349. data/spec/models/snf_core/wallet_spec.rb +28 -0
  350. data/spec/rails_helper.rb +46 -0
  351. data/spec/requests/snf_core/auth_spec.rb +139 -0
  352. data/spec/sample_spec.rb +5 -0
  353. data/spec/spec_helper.rb +36 -0
  354. data/spec/support/models/shared_examples.rb +49 -0
  355. data/spec/support/requests/shared_requests.rb +130 -0
  356. metadata +320 -3
@@ -0,0 +1,33 @@
1
+ FactoryBot.define do
2
+ factory :order, class: "SnfCore::Order" do
3
+ user
4
+ store
5
+ status { :pending }
6
+ trait :with_items do
7
+ after(:create) do |order|
8
+ create_list(:order_item, 2, order: order)
9
+ order.reload
10
+ end
11
+ end
12
+
13
+ trait :confirmed do
14
+ status { :confirmed }
15
+ end
16
+
17
+ trait :processing do
18
+ status { :processing }
19
+ end
20
+
21
+ trait :shipped do
22
+ status { :shipped }
23
+ end
24
+
25
+ trait :delivered do
26
+ status { :delivered }
27
+ end
28
+
29
+ trait :cancelled do
30
+ status { :cancelled }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :product, class: "SnfCore::Product" do
3
+ sku { Faker::Alphanumeric.alpha(number: 10) }
4
+ name { Faker::Commerce.product_name }
5
+ description { Faker::Lorem.word }
6
+ category
7
+ base_price { Faker::Number.between(from: 10.0, to: 10000.0) }
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :role, class: "SnfCore::Role" do
3
+ name { Faker::Name.name }
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :store_inventory, class: "SnfCore::StoreInventory" do
3
+ store
4
+ product
5
+ status { 0 }
6
+ base_price { Faker::Commerce.price(range: 10..1000.0) }
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :store, class: "SnfCore::Store" do
3
+ name { Faker::Name.name }
4
+ email { Faker::Internet.email }
5
+ operational_status { 1 }
6
+ business
7
+ address
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :user_role, class: "SnfCore::UserRole" do
3
+ user
4
+ role
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ FactoryBot.define do
2
+ factory :user, class: "SnfCore::User" do
3
+ first_name { Faker::Name.first_name }
4
+ middle_name { Faker::Name.middle_name }
5
+ last_name { Faker::Name.last_name }
6
+ password_digest { Faker::Internet.password }
7
+ password_changed { false }
8
+ reset_password_token { Faker::Internet.password }
9
+ email { Faker::Internet.email }
10
+ phone_number { Faker::Alphanumeric.alpha(number: 10) }
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :wallet, class: "SnfCore::Wallet" do
3
+ user
4
+ balance { 0.0 }
5
+ is_active { true }
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module SnfCore
2
+ # Preview all emails at http://localhost:3000/rails/mailers/auth_mailer
3
+ class AuthMailerPreview < ActionMailer::Preview
4
+
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ require "rails_helper"
2
+
3
+ module SnfCore
4
+ RSpec.describe AuthMailer, type: :mailer do
5
+ pending "add some examples to (or delete) #{__FILE__}"
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Address, type: :model do
5
+ attributes = [
6
+ { address_type: :presence },
7
+ { city: :presence },
8
+ { sub_city: :presence },
9
+ { latitude: %i[presence numericality] },
10
+ { longitude: %i[presence numericality] }
11
+ ]
12
+
13
+ include_examples("model_shared_spec", :address, attributes)
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe BusinessDocument, type: :model do
5
+ attributes = [
6
+ { business: :belong_to },
7
+ { document_type: :presence },
8
+ { uploaded_at: :presence }
9
+ ]
10
+ include_examples("model_shared_spec", :business_document, attributes)
11
+
12
+
13
+ it "has verified_by that belongs to user but can be null" do
14
+ business_document = create(:business_document)
15
+ expect(business_document.verified_by).to be_a(SnfCore::User)
16
+ business_document.verified_by = nil
17
+ expect(business_document.valid?).to be_truthy
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Business, type: :model do
5
+ attributes = [
6
+ { business_name: :presence },
7
+ { tin_number: %i[presence uniqueness] },
8
+ { business_type: :presence },
9
+ { verification_status: :presence },
10
+ { user: :belong_to }
11
+ ]
12
+ include_examples("model_shared_spec", :business, attributes)
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Category, type: :model do
5
+ attributes = [
6
+ { name: %i[presence uniqueness] }
7
+ ]
8
+ include_examples("model_shared_spec", :category, attributes)
9
+
10
+ it { is_expected.to belong_to(:parent).class_name('Category').optional }
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe CustomerGroup, type: :model do
5
+ attributes = [
6
+ { group: :belong_to },
7
+ { customer: :belong_to }
8
+ ]
9
+ include_examples("model_shared_spec", :customer_group, attributes)
10
+ end
11
+ end
@@ -0,0 +1,70 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe DeliveryOrder, type: :model do
5
+ attributes = [
6
+ { order: :belong_to },
7
+ { delivery_address: :presence },
8
+ { contact_phone: :presence },
9
+ { delivery_notes: :presence },
10
+ { estimated_delivery_time: :presence },
11
+ { status: :presence }
12
+ ]
13
+ include_examples("model_shared_spec", :delivery_order, attributes)
14
+
15
+ describe 'status transitions' do
16
+ let(:delivery) { create(:delivery_order) }
17
+
18
+ it 'starts with pending status' do
19
+ expect(delivery.status).to eq('pending')
20
+ end
21
+
22
+ it 'can transition from pending to assigned' do
23
+ delivery.assign!
24
+ expect(delivery.status).to eq('assigned')
25
+ end
26
+
27
+ it 'can transition from assigned to picked up' do
28
+ delivery.update!(status: :assigned)
29
+ delivery.pick_up!
30
+ expect(delivery.status).to eq('picked_up')
31
+ end
32
+
33
+ it 'can transition from picked up to in transit' do
34
+ delivery.update!(status: :picked_up)
35
+ delivery.start_transit!
36
+ expect(delivery.status).to eq('in_transit')
37
+ end
38
+
39
+ it 'can transition from in transit to delivered' do
40
+ delivery.update!(status: :in_transit)
41
+ expect {
42
+ delivery.mark_delivered!
43
+ }.to change { delivery.actual_delivery_time }.from(nil)
44
+ expect(delivery.status).to eq('delivered')
45
+ end
46
+
47
+ it 'can be marked as failed unless delivered' do
48
+ delivery.mark_failed!
49
+ expect(delivery.status).to eq('failed')
50
+
51
+ delivered_delivery = create(:delivery_order, :delivered)
52
+ delivered_delivery.mark_failed!
53
+ expect(delivered_delivery.status).to eq('delivered')
54
+ end
55
+
56
+ it 'can be cancelled unless delivered or failed' do
57
+ delivery.cancel!
58
+ expect(delivery.status).to eq('cancelled')
59
+
60
+ delivered_delivery = create(:delivery_order, :delivered)
61
+ delivered_delivery.cancel!
62
+ expect(delivered_delivery.status).to eq('delivered')
63
+
64
+ failed_delivery = create(:delivery_order, :failed)
65
+ failed_delivery.cancel!
66
+ expect(failed_delivery.status).to eq('failed')
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Group, type: :model do
5
+ attributes = [
6
+ { business: :belong_to },
7
+ { name: :presence }
8
+ ]
9
+ include_examples("model_shared_spec", :group, attributes)
10
+ end
11
+ end
@@ -0,0 +1,64 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe OrderItem, type: :model do
5
+ attributes = [
6
+ { order: :belong_to },
7
+ { store_inventory: :belong_to },
8
+ { quantity: [:presence, :numericality] },
9
+ { unit_price: [:presence, :numericality] },
10
+ ]
11
+ include_examples("model_shared_spec", :order_item, attributes)
12
+
13
+ describe 'calculations' do
14
+ it 'calculates subtotal before validation' do
15
+ order_item = build(:order_item, quantity: 2, unit_price: 10.0)
16
+ order_item.valid?
17
+ expect(order_item.subtotal).to eq(20.0)
18
+ end
19
+
20
+ it 'updates subtotal when quantity changes' do
21
+ order_item = create(:order_item, quantity: 2, unit_price: 10.0)
22
+ order_item.update(quantity: 3)
23
+ expect(order_item.subtotal).to eq(30.0)
24
+ end
25
+
26
+ it 'updates subtotal when unit_price changes' do
27
+ order_item = create(:order_item, quantity: 2, unit_price: 10.0)
28
+ order_item.update(unit_price: 15.0)
29
+ expect(order_item.subtotal).to eq(30.0)
30
+ end
31
+ end
32
+
33
+ describe 'validations' do
34
+ it 'validates quantity is greater than 0' do
35
+ order_item = build(:order_item, quantity: 0)
36
+ expect(order_item).not_to be_valid
37
+ expect(order_item.errors[:quantity]).to include('must be greater than 0')
38
+ end
39
+
40
+ it 'validates unit_price is greater than or equal to 0' do
41
+ order_item = build(:order_item, unit_price: -1)
42
+ expect(order_item).not_to be_valid
43
+ expect(order_item.errors[:unit_price]).to include('must be greater than or equal to 0')
44
+ end
45
+ end
46
+
47
+ describe 'order total updates' do
48
+ it 'updates order total when item is created' do
49
+ order = create(:order)
50
+ order_item = create(:order_item, order: order, quantity: 2, unit_price: 10.0)
51
+
52
+ expect(order.reload.total_amount).to eq(20.0)
53
+ end
54
+
55
+ it 'updates order total when item is modified' do
56
+ order = create(:order)
57
+ order_item = create(:order_item, order: order, quantity: 2, unit_price: 10.0)
58
+
59
+ order_item.update(quantity: 3)
60
+ expect(order.reload.total_amount).to eq(30.0)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,81 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Order, type: :model do
5
+ attributes = [
6
+ { user: :belong_to },
7
+ { store: :belong_to },
8
+ { order_items: :have_many },
9
+ { store_inventories: :have_many },
10
+ { status: :presence }
11
+ ]
12
+ include_examples("model_shared_spec", :order, attributes)
13
+
14
+ describe 'status transitions' do
15
+ let(:order) { create(:order) }
16
+
17
+ it 'starts with pending status' do
18
+ expect(order.status).to eq('pending')
19
+ end
20
+
21
+ it 'can transition from pending to confirmed' do
22
+ order.confirm!
23
+ expect(order.status).to eq('confirmed')
24
+ end
25
+
26
+ it 'can transition from confirmed to processing' do
27
+ order.update!(status: :confirmed)
28
+ order.process!
29
+ expect(order.status).to eq('processing')
30
+ end
31
+
32
+ it 'can transition from processing to shipped' do
33
+ order.update!(status: :processing)
34
+ order.ship!
35
+ expect(order.status).to eq('shipped')
36
+ end
37
+
38
+ it 'can transition from shipped to delivered' do
39
+ order.update!(status: :shipped)
40
+ order.deliver!
41
+ expect(order.status).to eq('delivered')
42
+ end
43
+
44
+ it 'can be cancelled unless delivered' do
45
+ order.cancel!
46
+ expect(order.status).to eq('cancelled')
47
+
48
+ delivered_order = create(:order, status: :delivered)
49
+ delivered_order.cancel!
50
+ expect(delivered_order.status).to eq('delivered')
51
+ end
52
+ end
53
+
54
+ describe 'total amount calculation' do
55
+ let(:order) { create(:order) }
56
+
57
+ it 'calculates total amount from order items' do
58
+ create(:order_item, order: order, quantity: 2, unit_price: 10.0)
59
+ create(:order_item, order: order, quantity: 1, unit_price: 20.0)
60
+
61
+ order.valid?
62
+ expect(order.total_amount()).to eq(40.0)
63
+ end
64
+
65
+ it 'updates total amount when order items change' do
66
+ item = create(:order_item, order: order, quantity: 2, unit_price: 10.0)
67
+ order.valid?
68
+ expect(order.total_amount()).to eq(20.0)
69
+
70
+ item.update(quantity: 3)
71
+ order.reload.valid?
72
+ expect(order.total_amount()).to eq(30.0)
73
+ end
74
+
75
+ it 'handles empty order items' do
76
+ order.valid?
77
+ expect(order.total_amount()).to eq(0.0)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,17 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Product, type: :model do
5
+ attributes = [
6
+ { name: :presence },
7
+ { sku: %i[presence uniqueness] }
8
+ ]
9
+ include_examples("model_shared_spec", :product, attributes)
10
+
11
+
12
+ describe "Product active storage" do
13
+ it { is_expected.to have_one_attached(:thumbnail_image) }
14
+ it { is_expected.to have_many_attached(:images) }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Role, type: :model do
5
+ attributes = [
6
+ { name: %i[presence uniqueness] },
7
+ { user_roles: :have_many },
8
+ { users: :have_many }
9
+ ]
10
+ include_examples("model_shared_spec", :role, attributes)
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe StoreInventory, type: :model do
5
+ attributes = [
6
+ { store: :belong_to },
7
+ { product: :belong_to },
8
+ { base_price: %i[presence numericality] },
9
+ { status: :presence }
10
+ ]
11
+ include_examples("model_shared_spec", :store_inventory, attributes)
12
+
13
+ describe 'validations' do
14
+ it 'validates unique store-product combination' do
15
+ store_inventory = create(:store_inventory)
16
+ duplicate = build(:store_inventory,
17
+ store: store_inventory.store,
18
+ product: store_inventory.product
19
+ )
20
+ expect(duplicate).not_to be_valid
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Store, type: :model do
5
+ attributes = [
6
+ { name: :presence },
7
+ { operational_status: :presence },
8
+ { business: :belong_to },
9
+ { address: :belong_to }
10
+ ]
11
+ include_examples("model_shared_spec", :store, attributes)
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe UserRole, type: :model do
5
+ attributes = [
6
+ { role: :belong_to },
7
+ { user: :belong_to },
8
+ ]
9
+ include_examples("model_shared_spec", :user_role, attributes)
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe User, type: :model do
5
+ attributes = [
6
+ { first_name: :presence },
7
+ { middle_name: :presence },
8
+ { last_name: :presence },
9
+ { phone_number: %i[presence uniqueness] }
10
+ ]
11
+ include_examples("model_shared_spec", :user, attributes)
12
+
13
+ describe 'wallet creation' do
14
+ it 'creates a wallet automatically for the user' do
15
+ user = create(:user)
16
+ expect(user.wallet).to be_present
17
+ expect(user.wallet.balance).to eq(0.0)
18
+ expect(user.wallet.is_active).to be_truthy
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe Wallet, type: :model do
5
+ attributes = [
6
+ { wallet_number: :presence },
7
+ { balance: :presence },
8
+ { is_active: :presence },
9
+ { user: :belong_to }
10
+ ]
11
+
12
+ include_examples("model_shared_spec", :wallet, attributes)
13
+
14
+ describe 'wallet number generation' do
15
+ it 'automatically generates a wallet number on creation' do
16
+ wallet = create(:wallet)
17
+ expect(wallet.wallet_number).to be_present
18
+ expect(wallet.wallet_number.length).to eq(12)
19
+ end
20
+
21
+ it 'ensures wallet numbers are unique' do
22
+ first_wallet = create(:wallet)
23
+ second_wallet = create(:wallet)
24
+ expect(first_wallet.wallet_number).not_to eq(second_wallet.wallet_number)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ require "spec_helper"
3
+ ENV["RAILS_ENV"] ||= "test"
4
+ require_relative "../spec/dummy/config/environment"
5
+ abort("The Rails environment is running in production mode!") if Rails.env.production?
6
+
7
+ require "rspec/rails"
8
+ require "database_cleaner/active_record"
9
+ require "factory_bot_rails"
10
+ require "faker"
11
+ require "shoulda-matchers"
12
+
13
+ begin
14
+ ActiveRecord::Migration.maintain_test_schema!
15
+ rescue ActiveRecord::PendingMigrationError => e
16
+ abort e.to_s.strip
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.before(:suite) do
21
+ DatabaseCleaner.strategy = :transaction
22
+ DatabaseCleaner.clean_with(:truncation)
23
+ end
24
+
25
+ config.before do
26
+ DatabaseCleaner.strategy = :transaction
27
+ DatabaseCleaner.start
28
+ end
29
+
30
+ config.append_after do
31
+ DatabaseCleaner.clean
32
+ end
33
+
34
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
35
+ config.use_transactional_fixtures = true
36
+ config.infer_spec_type_from_file_location!
37
+ config.filter_rails_from_backtrace!
38
+ config.include FactoryBot::Syntax::Methods
39
+ end
40
+
41
+ Shoulda::Matchers.configure do |config|
42
+ config.integrate do |with|
43
+ with.test_framework(:rspec)
44
+ with.library(:rails)
45
+ end
46
+ end