def METHOD_NAME(self, node: TestNode, dust_relay_fee: Decimal,
                     output_script: CScript, type_desc: str) -> None:
    # determine dust threshold (see `GetDustThreshold`)
    if output_script[0] == OP_RETURN:
        dust_threshold = 0
    else:
        tx_size = len(CTxOut(nValue=0, scriptPubKey=output_script).serialize())
        tx_size += 67 if output_script.IsWitnessProgram() else 148
        dust_threshold = int(get_fee(tx_size, dust_relay_fee) * COIN)
    self.log.info(f"-> Test {type_desc} output (size {len(output_script)}, limit {dust_threshold})")
    # amount right on the dust threshold should pass
    tx = self.wallet.create_self_transfer()["tx"]
    tx.vout.append(CTxOut(nValue=dust_threshold, scriptPubKey=output_script))
    tx.vout[0].nValue -= dust_threshold  # keep total output value constant
    tx_good_hex = tx.serialize().hex()
    res = node.testmempoolaccept([tx_good_hex])[0]
    assert_equal(res['allowed'], True)
    # amount just below the dust threshold should fail
    if dust_threshold > 0:
        tx.vout[1].nValue -= 1
        res = node.testmempoolaccept([tx.serialize().hex()])[0]
        assert_equal(res['allowed'], False)
        assert_equal(res['reject-reason'], 'dust')
    # finally send the transaction to avoid running out of MiniWallet UTXOs
    self.wallet.sendrawtransaction(from_node=node, tx_hex=tx_good_hex)