Files
sure/test/controllers/import/configurations_controller_test.rb
ghost 6ea931f3fe feat(imports): add YNAB CSV import (#2361)
Adds YnabImport (mirroring ActualImport) for YNAB "Export budget" register CSVs:

- Amount — combines the split Outflow/Inflow columns into a single signed amount
  (inflow - |outflow|), stripping currency symbols and thousands separators. A
  single signed Amount column takes precedence when present.
- Category — resolves across export shapes: the combined "Category Group/Category"
  column, the split "Category Group" + "Category", or legacy YNAB 4
  "Master Category" + "Sub Category".
- Names — falls back from a blank Payee to the Memo, then the default row name.
- Validation — requires at least one amount source (Outflow/Inflow or Amount); a
  file exposing none leaves rows un-clean instead of importing zero-dollar entries.

Enables the previously-disabled YNAB option on the imports screen (using the YNAB
logo, like Mint) with its configuration partial, and removes the now-dead
imports.new.coming_soon locale key. Documents the type in the API import-type
enums (rswag request spec + swagger_helper + generated openapi.yaml).

Closes #1255.
2026-06-16 08:32:17 +02:00

59 lines
1.7 KiB
Ruby

require "test_helper"
class Import::ConfigurationsControllerTest < ActionDispatch::IntegrationTest
setup do
sign_in @user = users(:family_admin)
@import = imports(:transaction)
end
test "show" do
get import_configuration_url(@import)
assert_response :success
end
test "show renders the YNAB configuration partial" do
ynab = @user.family.imports.create!(
type: "YnabImport",
raw_file_str: file_fixture("imports/ynab.csv").read,
col_sep: ","
)
get import_configuration_url(ynab)
assert_response :success
end
test "updating a valid configuration regenerates rows" do
TransactionImport.any_instance.expects(:generate_rows_from_csv).once
patch import_configuration_url(@import), params: {
import: {
date_col_label: "Date",
date_format: "%Y-%m-%d",
name_col_label: "Name",
category_col_label: "Category",
tags_col_label: "Tags",
amount_col_label: "Amount",
signage_convention: "inflows_positive",
account_col_label: "Account",
number_format: "1.234,56"
}
}
assert_redirected_to import_clean_url(@import)
assert_equal "Import configured successfully.", flash[:notice]
# Verify configurations were saved
@import.reload
assert_equal "Date", @import.date_col_label
assert_equal "%Y-%m-%d", @import.date_format
assert_equal "Name", @import.name_col_label
assert_equal "Category", @import.category_col_label
assert_equal "Tags", @import.tags_col_label
assert_equal "Amount", @import.amount_col_label
assert_equal "inflows_positive", @import.signage_convention
assert_equal "Account", @import.account_col_label
assert_equal "1.234,56", @import.number_format
end
end