Skip to content

Instantly share code, notes, and snippets.

View milanstevanovic's full-sized avatar

Milan Stevanović milanstevanovic

View GitHub Profile

Using a Serbian ID Card (MUP RS) for Digital Signing on macOS

A guide for using the qualified electronic certificate on a Serbian ID card (lična karta) on macOS — including signing documents for APR and authenticating on government portals like eUprava and ePorezi.

⚠️ MUP does not officially support macOS. This guide uses open-source tools created by Nikola Ubavić as a replacement for the Windows-only TrustEdgeID middleware.

Tested on: Apple Silicon (M3) + macOS Sequoia 15.x, April 2026.


class SearchResultsTests: XCTestCase {
private var searchResultsPage: SearchResultsPage!
override func setUp() {
super.setUp()
self.searchResultsPage = self.launchApp(withStubbingConfigurationFileName: "stubs_search.json").openSearchTab().startSearch()
}
override func tearDown() {
self.searchResultsPage = nil
final class SearchResultsPage: UIElementPage<UIElements.Pages.SearchResultsPage> {
private(set) lazy var searchBar = SearchBar()
private(set) lazy var headerTitle = self.staticText(.resultsLabel)
private(set) lazy var tagCollectionView = self.collection(.tagsCollectionView)
private(set) lazy var searchResultsTableView = self.table(.tableView)
var stockSearchResults: [SearchResultsCell] {
get {
let elements = self.searchResultsTableView.cells.allElementsBoundByIndex.filter { $0.identifier.contains(UIElements.Cells.SearchResultsCell.root.rawValue) }
class SearchViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.makeViewTestable()
}
}
extension SearchViewController: UITestablePage {
enum UIElements {
enum Pages {
enum SearchPage: String, UIElement {
case root = "vertical_search_page"
case startSearchButton = "vertical_search_start_search"
case tableView = "vertical_search_table_view"
}
protocol UITestablePage {
associatedtype UIElementType: UIElement
func makeViewTestable(_ view: UIView, using element: UIElementType)
func makeViewTestable(_ view: UIView, using element: UIElementType, sequence: String)
}
extension UITestablePage {
protocol UIElement {
var accessibilityIdentifier: String { get }
}
extension UIElement where Self: RawRepresentable {
var accessibilityIdentifier: RawValue {
return self.rawValue
}
class UIElementPage<T: UIElement>: Page {
override init(element: XCUIElement) {
super.init(element: element)
}
init(root: T) {
super.init(element: Page.app.otherElements[root])
}
class Page {
let element: XCUIElement
init(element: XCUIElement) {
self.element = element
}
}