taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

ConfigProductTest.kt (3339B)


      1 package net.taler.merchantpos.config
      2 
      3 import net.taler.common.Amount
      4 import net.taler.common.CurrencySpecification
      5 import org.junit.Assert.assertEquals
      6 import org.junit.Assert.assertNull
      7 import org.junit.Test
      8 
      9 class ConfigProductTest {
     10 
     11     @Test
     12     fun `display description is hidden when same as product name`() {
     13         val product = ConfigProduct(
     14             productName = "Coffee",
     15             description = "Coffee",
     16             price = Amount("KUDOS", 2, 0),
     17             categories = listOf(1)
     18         )
     19 
     20         assertEquals("Coffee", product.displayName)
     21         assertNull(product.displayDescription)
     22     }
     23 
     24     @Test
     25     fun `display price formats amount`() {
     26         val product = ConfigProduct(
     27             description = "Coffee",
     28             price = Amount("KUDOS", 2, 50000000),
     29             categories = listOf(1)
     30         )
     31 
     32         assertEquals("2.50 KUDOS", product.displayPrice)
     33     }
     34 
     35     @Test
     36     fun `display price uses currency spec symbol`() {
     37         val product = ConfigProduct(
     38             description = "Coffee",
     39             price = Amount("CHF", 2, 50000000).withSpec(
     40                 CurrencySpecification(
     41                     name = "Swiss Francs",
     42                     numFractionalInputDigits = 2,
     43                     numFractionalNormalDigits = 2,
     44                     numFractionalTrailingZeroDigits = 2,
     45                     altUnitNames = mapOf(0 to "Fr."),
     46                 )
     47             ),
     48             categories = listOf(1)
     49         )
     50 
     51         assertEquals("Fr.2.50", product.displayPrice)
     52     }
     53 
     54     @Test
     55     fun `stockLimit subtracts sold and lost from total stock`() {
     56         val product = ConfigProduct(
     57             description = "finite_quantity",
     58             price = Amount("KUDOS", 10, 0),
     59             categories = emptyList(),
     60             totalStock = 10,
     61             unitTotalStock = "10",
     62             totalSold = 0,
     63             totalLost = 2,
     64         )
     65 
     66         assertEquals(8, product.stockLimit)
     67     }
     68 
     69     @Test
     70     fun `stockLimit subtracts unit sold and lost`() {
     71         val product = ConfigProduct(
     72             description = "test",
     73             price = Amount("KUDOS", 5, 0),
     74             categories = emptyList(),
     75             unitTotalStock = "10",
     76             unitTotalSold = "2",
     77             unitTotalLost = "3",
     78         )
     79 
     80         assertEquals(5, product.stockLimit)
     81     }
     82 
     83     @Test
     84     fun `stockLimit with no sold or lost returns total stock`() {
     85         val product = ConfigProduct(
     86             description = "test",
     87             price = Amount("KUDOS", 5, 0),
     88             categories = emptyList(),
     89             totalStock = 10,
     90         )
     91 
     92         assertEquals(10, product.stockLimit)
     93     }
     94 
     95     @Test
     96     fun `stockLimit returns null for unlimited stock`() {
     97         val product = ConfigProduct(
     98             description = "test",
     99             price = Amount("KUDOS", 5, 0),
    100             categories = emptyList(),
    101             totalStock = -1,
    102         )
    103 
    104         assertNull(product.stockLimit)
    105     }
    106 
    107     @Test
    108     fun `stockLimit clamps to zero when sold and lost exceed stock`() {
    109         val product = ConfigProduct(
    110             description = "test",
    111             price = Amount("KUDOS", 5, 0),
    112             categories = emptyList(),
    113             totalStock = 5,
    114             totalSold = 3,
    115             totalLost = 5,
    116         )
    117 
    118         assertEquals(0, product.stockLimit)
    119     }
    120 }