/app/src/test/java/co/smartreceipts/android/filters/ReceiptFilterTest.java

https://github.com/wbaumann/SmartReceiptsLibrary · Java · 262 lines · 202 code · 47 blank · 13 comment · 0 complexity · bf62c0a7f7954c3f792fde0d125713ac MD5 · raw file

  1. package co.smartreceipts.android.filters;
  2. import android.content.Context;
  3. import androidx.test.core.app.ApplicationProvider;
  4. import org.json.JSONException;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.robolectric.RobolectricTestRunner;
  9. import java.sql.Date;
  10. import java.util.ArrayList;
  11. import java.util.TimeZone;
  12. import co.smartreceipts.android.model.Receipt;
  13. import co.smartreceipts.android.model.factory.CategoryBuilderFactory;
  14. import co.smartreceipts.android.utils.ReceiptUtils;
  15. import static org.junit.Assert.assertEquals;
  16. import static org.junit.Assert.assertFalse;
  17. import static org.junit.Assert.assertTrue;
  18. @RunWith(RobolectricTestRunner.class)
  19. public class ReceiptFilterTest {
  20. // Test constants for Price checking
  21. private static final String PRICE_NORMAL = "100.00";
  22. private static final String PRICE_HIGH = "150.00";
  23. private static final String PRICE_LOW = "50.00";
  24. // Test constants for Date checking
  25. private static final TimeZone TZ = ReceiptUtils.Constants.TIMEZONE;
  26. private static final long MILLIS = new java.util.Date().getTime();
  27. private static final Date NOW = new Date(MILLIS);
  28. private static final Date FUTURE = new Date(MILLIS + 1000);
  29. private static final Date PAST = new Date(MILLIS - 1000);
  30. private Context context;
  31. @Before
  32. public void setUp() {
  33. context = ApplicationProvider.getApplicationContext();
  34. }
  35. @Test
  36. public void receiptCategoryFilterTest() throws JSONException {
  37. final Receipt receipt1 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).build();
  38. final Receipt receipt2 = ReceiptUtils.newDefaultReceiptBuilderFactory(context)
  39. .setCategory(new CategoryBuilderFactory().setName("BAD Category").build()).build();
  40. final ReceiptCategoryFilter filter = new ReceiptCategoryFilter(ReceiptUtils.Constants.CATEGORY.getName());
  41. assertTrue(filter.accept(receipt1));
  42. assertFalse(filter.accept(receipt2));
  43. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation())); // Confirm we can properly recreate
  44. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_category);
  45. assertEquals(filter.getType(), FilterType.String);
  46. }
  47. @Test
  48. public void receiptIsReimbursableFilterTest() throws JSONException {
  49. final Receipt receipt1 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setIsReimbursable(true).build();
  50. final Receipt receipt2 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setIsReimbursable(false).build();
  51. final ReceiptIsReimbursableFilter filter = new ReceiptIsReimbursableFilter();
  52. assertTrue(filter.accept(receipt1));
  53. assertFalse(filter.accept(receipt2));
  54. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  55. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_reimbursable);
  56. assertEquals(filter.getType(), FilterType.Boolean);
  57. }
  58. @Test
  59. public void receiptIsSelectedFilterTest() throws JSONException {
  60. final Receipt receipt1 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setIsSelected(true).build();
  61. final Receipt receipt2 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setIsSelected(false).build();
  62. final ReceiptSelectedFilter filter = new ReceiptSelectedFilter();
  63. assertTrue(filter.accept(receipt1));
  64. assertFalse(filter.accept(receipt2));
  65. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  66. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_selected);
  67. assertEquals(filter.getType(), FilterType.Boolean);
  68. }
  69. @Test
  70. public void receiptMinimumPriceFilterTest() throws JSONException {
  71. final Receipt receiptNormal = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_NORMAL).build();
  72. final Receipt receiptHigh = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_HIGH).build();
  73. final Receipt receiptLow = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_LOW).build();
  74. final ReceiptMinimumPriceFilter filter = new ReceiptMinimumPriceFilter(
  75. Float.parseFloat(PRICE_NORMAL), ReceiptUtils.Constants.CURRENCY_CODE);
  76. assertTrue(filter.accept(receiptNormal));
  77. assertTrue(filter.accept(receiptHigh));
  78. assertFalse(filter.accept(receiptLow));
  79. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  80. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_min_price);
  81. assertEquals(filter.getType(), FilterType.Float);
  82. }
  83. @Test
  84. public void receiptMaximumPriceFilterTest() throws JSONException {
  85. final Receipt receiptNormal = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_NORMAL).build();
  86. final Receipt receiptHigh = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_HIGH).build();
  87. final Receipt receiptLow = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_LOW).build();
  88. final ReceiptMaximumPriceFilter filter = new ReceiptMaximumPriceFilter(
  89. Float.parseFloat(PRICE_NORMAL), ReceiptUtils.Constants.CURRENCY_CODE);
  90. assertTrue(filter.accept(receiptNormal));
  91. assertFalse(filter.accept(receiptHigh));
  92. assertTrue(filter.accept(receiptLow));
  93. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  94. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_max_price);
  95. assertEquals(filter.getType(), FilterType.Float);
  96. }
  97. @Test
  98. public void receiptOnOrAfterDayFilterTest() throws JSONException {
  99. final Receipt receiptNow = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(NOW).build();
  100. final Receipt receiptFuture = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(FUTURE).build();
  101. final Receipt receiptPast = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(PAST).build();
  102. final ReceiptOnOrAfterDayFilter filter = new ReceiptOnOrAfterDayFilter(NOW, TZ);
  103. assertTrue(filter.accept(receiptNow));
  104. assertTrue(filter.accept(receiptFuture));
  105. assertFalse(filter.accept(receiptPast));
  106. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  107. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_on_or_after);
  108. assertEquals(filter.getType(), FilterType.Date);
  109. }
  110. @Test
  111. public void receiptOnOrBeforeDayFilterTest() throws JSONException {
  112. final Receipt receiptNow = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(NOW).build();
  113. final Receipt receiptFuture = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(FUTURE).build();
  114. final Receipt receiptPast = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setDate(PAST).build();
  115. final ReceiptOnOrBeforeDayFilter filter = new ReceiptOnOrBeforeDayFilter(NOW, TZ);
  116. assertTrue(filter.accept(receiptNow));
  117. assertFalse(filter.accept(receiptFuture));
  118. assertTrue(filter.accept(receiptPast));
  119. assertEquals(filter, FilterFactory.getReceiptFilter(filter.getJsonRepresentation()));
  120. assertEquals(filter.getNameResource(), co.smartreceipts.android.R.string.filter_name_receipt_on_or_before);
  121. assertEquals(filter.getType(), FilterType.Date);
  122. }
  123. @Test
  124. public void receiptOrFilterTest() throws JSONException {
  125. final String category2 = "cat2";
  126. final Receipt receipt1 = ReceiptUtils.newDefaultReceiptBuilderFactory(context).build();
  127. final Receipt receipt2 = ReceiptUtils.newDefaultReceiptBuilderFactory(context)
  128. .setCategory(new CategoryBuilderFactory().setName(category2).build()).build();
  129. final Receipt receipt3 = ReceiptUtils.newDefaultReceiptBuilderFactory(context)
  130. .setCategory(new CategoryBuilderFactory().setName("BAD Category").build()).build();
  131. final ReceiptCategoryFilter filter1 = new ReceiptCategoryFilter(ReceiptUtils.Constants.CATEGORY.getName());
  132. final ReceiptCategoryFilter filter2 = new ReceiptCategoryFilter(category2);
  133. final ReceiptOrFilter orFilter = new ReceiptOrFilter();
  134. orFilter.or(filter1);
  135. orFilter.or(filter2);
  136. assertTrue(orFilter.accept(receipt1));
  137. assertTrue(orFilter.accept(receipt2));
  138. assertFalse(orFilter.accept(receipt3));
  139. assertEquals(orFilter, FilterFactory.getReceiptFilter(orFilter.getJsonRepresentation())); // Confirm we can properly recreate
  140. assertEquals(orFilter.getNameResource(), co.smartreceipts.android.R.string.filter_name_or);
  141. assertEquals(orFilter.getType(), FilterType.Composite);
  142. }
  143. @Test
  144. public void receiptAndFilterTest() throws JSONException {
  145. final Receipt receipt = ReceiptUtils.newDefaultReceiptBuilderFactory(context).build();
  146. final ReceiptIsReimbursableFilter trueFilter1 = new ReceiptIsReimbursableFilter();
  147. final ReceiptCategoryFilter trueFilter2 = new ReceiptCategoryFilter(ReceiptUtils.Constants.CATEGORY.getName());
  148. final ReceiptCategoryFilter falseFilter = new ReceiptCategoryFilter("BAD Category");
  149. final ReceiptAndFilter andFilterGood = new ReceiptAndFilter();
  150. final ReceiptAndFilter andFilterBad = new ReceiptAndFilter();
  151. andFilterGood.and(trueFilter1).and(trueFilter2);
  152. andFilterBad.and(trueFilter1).and(trueFilter2).and(falseFilter);
  153. assertTrue(andFilterGood.accept(receipt));
  154. assertFalse(andFilterBad.accept(receipt));
  155. assertEquals(andFilterGood, FilterFactory.getReceiptFilter(andFilterGood.getJsonRepresentation()));
  156. assertEquals(andFilterBad, FilterFactory.getReceiptFilter(andFilterBad.getJsonRepresentation()));
  157. assertEquals(andFilterGood.getNameResource(), co.smartreceipts.android.R.string.filter_name_and);
  158. assertEquals(andFilterGood.getType(), FilterType.Composite);
  159. }
  160. @Test
  161. public void receiptNotFilterTest() throws JSONException {
  162. // in this test scenario, we will only accept receiptHigh
  163. // accept rule: NOT (price <= normal)
  164. // equivalent to: (price > normal)
  165. final Receipt receiptNormal = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_NORMAL).build();
  166. final Receipt receiptHigh = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_HIGH).build();
  167. final Receipt receiptLow = ReceiptUtils.newDefaultReceiptBuilderFactory(context).setPrice(PRICE_LOW).build();
  168. final ReceiptMaximumPriceFilter priceFilter = new ReceiptMaximumPriceFilter(Float.parseFloat(PRICE_NORMAL), ReceiptUtils.Constants.CURRENCY_CODE);
  169. final ReceiptNotFilter notFilter = new ReceiptNotFilter(priceFilter);
  170. assertFalse(notFilter.accept(receiptNormal));
  171. assertTrue(notFilter.accept(receiptHigh)); // accepted
  172. assertFalse(notFilter.accept(receiptLow));
  173. assertEquals(notFilter, FilterFactory.getReceiptFilter(notFilter.getJsonRepresentation()));
  174. assertEquals(notFilter.getNameResource(), co.smartreceipts.android.R.string.filter_name_not);
  175. assertEquals(notFilter.getType(), FilterType.Composite);
  176. }
  177. @Test
  178. public void receiptOrFilterConstructorTest() throws JSONException {
  179. // in this test scenario,
  180. // filters constructed with same data but different method should be equal
  181. final ReceiptCategoryFilter filter1 = new ReceiptCategoryFilter(ReceiptUtils.Constants.CATEGORY.getName());
  182. final ReceiptCategoryFilter filter2 = new ReceiptCategoryFilter("Just another category");
  183. // filter 1 -- composited filters added in object instantiation (i.e. constructor)
  184. final ArrayList<Filter<Receipt>> filters = new ArrayList<>();
  185. filters.add(filter1);
  186. filters.add(filter2);
  187. final ReceiptOrFilter orFilter1 = new ReceiptOrFilter(filters);
  188. // filter 2 -- composited filters added after object instantiation
  189. final ReceiptOrFilter orFilter2 = new ReceiptOrFilter();
  190. orFilter2.or(filter1);
  191. orFilter2.or(filter2);
  192. assertEquals(orFilter1, orFilter2);
  193. assertEquals(orFilter1, FilterFactory.getReceiptFilter(orFilter1.getJsonRepresentation()));
  194. assertEquals(orFilter2, FilterFactory.getReceiptFilter(orFilter2.getJsonRepresentation()));
  195. }
  196. @Test
  197. public void receiptAndFilterConstructorTest() throws JSONException {
  198. // in this test scenario,
  199. // filters constructed with same data but different method should be equal
  200. final ReceiptCategoryFilter filter1 = new ReceiptCategoryFilter(ReceiptUtils.Constants.CATEGORY.getName());
  201. final ReceiptCategoryFilter filter2 = new ReceiptCategoryFilter("Just another category");
  202. // filter 1 -- composited filters added in object instantiation (i.e. constructor)
  203. final ArrayList<Filter<Receipt>> filters = new ArrayList<>();
  204. filters.add(filter1);
  205. filters.add(filter2);
  206. final ReceiptAndFilter andFilter1 = new ReceiptAndFilter(filters);
  207. // filter 2 -- composited filters added after object instantiation
  208. final ReceiptAndFilter andFilter2 = new ReceiptAndFilter();
  209. andFilter2.and(filter1);
  210. andFilter2.and(filter2);
  211. assertEquals(andFilter1, andFilter2);
  212. assertEquals(andFilter1, FilterFactory.getReceiptFilter(andFilter1.getJsonRepresentation()));
  213. assertEquals(andFilter2, FilterFactory.getReceiptFilter(andFilter2.getJsonRepresentation()));
  214. }
  215. }